QDirListing Class
Die Klasse „QDirListing“ stellt einen Iterator im STL-Stil für Verzeichniseinträge bereit. Mehr...
| Header: | #include <QDirListing> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Seit: | Qt 6.8 |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QDirListing ist Teil von „Eingabe/Ausgabe und Netzwerk“.
Öffentliche Typen
| class | DirEntry |
(since 6.8) class | const_iterator |
(since 6.8) class | sentinel |
| enum class | IteratorFlag { Default, ExcludeFiles, ExcludeDirs, ExcludeOther, ResolveSymlinks, …, FollowDirSymlinks } |
| flags | IteratorFlags |
Öffentliche Funktionen
| QDirListing(const QString &path, QDirListing::IteratorFlags flags = IteratorFlag::Default) | |
| QDirListing(const QString &path, const QStringList &nameFilters, QDirListing::IteratorFlags flags = IteratorFlag::Default) | |
| QDirListing(QDirListing &&other) | |
| ~QDirListing() | |
| QDirListing::const_iterator | begin() const |
| QDirListing::const_iterator | cbegin() const |
| QDirListing::sentinel | cend() const |
| QDirListing::sentinel | end() const |
| QDirListing::IteratorFlags | iteratorFlags() const |
| QString | iteratorPath() const |
| QStringList | nameFilters() const |
| QDirListing & | operator=(QDirListing &&other) |
Ausführliche Beschreibung
Mit QDirListing können Sie nacheinander durch die Einträge eines Verzeichnisses navigieren. Es ähnelt den Funktionen „ QDir::entryList()“ und „ QDir::entryInfoList()“, ist jedoch skalierbarer und eignet sich besser für große Verzeichnisse, da es die Einträge einzeln statt alle auf einmal auflistet. Außerdem unterstützt es die rekursive Auflistung von Verzeichnisinhalten und das Verfolgen symbolischer Links. Im Gegensatz zu „ QDir::entryList()“ unterstützt QDirListing keine Sortierung.
Der Konstruktor von QDirListing nimmt eine Zeichenkette mit dem Verzeichnispfad als Argument entgegen. So können Sie alle Einträge rekursiv durchlaufen:
using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry: QDirListing(u"/etc"_s, ItFlag::Recursive)) {
qDebug() << dirEntry.filePath();
// /etc/.
// /etc/..
// /etc/X11
// /etc/X11/fs
// ...
}So können Sie alle regulären Dateien nach Namen gefiltert rekursiv suchen und lesen:
mit F = QDirListing::IteratorFlag;
QDirListing dirList(u"/sys"_s, QStringList{u"scaling_cur_freq"_s}, F::FilesOnly | F::Recursive);
for (const auto &dirEntry: dirList) {
QFile f(dirEntry.filePath());
if (f.open(QIODevice::ReadOnly))
qDebug() << f.fileName() << f.readAll().trimmed().toDouble() / 1000 << "MHz";
}So listest du nur reguläre Dateien rekursiv auf:
using F = QDirListing::IteratorFlag;
const auto flags = F::FilesOnly | F::Recursive;
for (const auto &dirEntry : QDirListing(u"/etc"_s, flags)) {
// ...
}So listen Sie rekursiv nur reguläre Dateien und symbolische Links zu regulären Dateien auf:
using F = QDirListing::IteratorFlag;
const auto flags = F::FilesOnly | F::Recursive | F::ResolveSymlinks;
for (const auto &dirEntry : QDirListing(u"/etc"_s, flags)) {
// ...
}QDirListing::const_iterator modelt std::input_iterator aus C++20, d. h., es handelt sich um einen „Move-only“- und „Forward-only“-Iterator für einen Durchlauf, der keinen wahlfreien Zugriff zulässt. Er kann in „ranged-for“-Schleifen (oder mit C++20-Bereichsalgorithmen, die keine Iteratoren mit wahlfreiem Zugriff erfordern) verwendet werden. Die Dereferenzierung eines gültigen Iterators gibt ein ` QDirListing::DirEntry `-Objekt zurück. Das Sentinel `(c)end()` markiert das Ende der Iteration. Die Dereferenzierung eines Iterators, der gleich ` sentinel ` ist, führt zu undefiniertem Verhalten.
QDirListing::DirEntry bietet eine Teilmenge der API von ` QFileInfo` an (z. B. `fileName()`, `filePath()`, `exists()`). Intern erstellt ` DirEntry ` ein ` QFileInfo `-Objekt nur bei Bedarf, d. h. wenn die Informationen nicht bereits von anderen Systemfunktionen abgerufen wurden. Mit ` DirEntry::fileInfo()` können Sie ein ` QFileInfo` abrufen. Zum Beispiel:
using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
// Faster
if (dirEntry.fileName().endsWith(u".conf")) { /* ... */ }
// This works, but might be potentially slower, since it has to construct a
// QFileInfo, whereas (depending on the implementation) the fileName could
// be known already
if (dirEntry.fileInfo().fileName().endsWith(u".conf")) { /* ... */ }
}
using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
// Both approaches are the same, because DirEntry will have to construct
// a QFileInfo to get this info (for example, by calling system stat())
if (dirEntry.size() >= 4'000 /* 4KB */) { /* ...*/ }
if (dirEntry.fileInfo().size() >= 4'000 /* 4KB */) { /* ... */ }
}Siehe auch QDir und QDir::entryList().
Dokumentation zu Mitgliedstypen
enum class QDirListing::IteratorFlag
flags QDirListing::IteratorFlags
Diese Enum-Klasse beschreibt Flags, mit denen das Verhalten von QDirListing konfiguriert werden kann. Die Werte dieser Enumeration können bitweise miteinander verknüpft (OR-Verknüpfung) werden.
| Konstante | Wert | Beschreibung |
|---|---|---|
QDirListing::IteratorFlag::Default | 0x000000 | Alle Einträge auflisten, d. h. Dateien, Verzeichnisse, symbolische Links einschließlich defekter symbolischer Links (bei denen das Ziel nicht existiert) und spezieller (anderer) Systemdateien; siehe „ExcludeOther“ für Details. Versteckte Dateien und Verzeichnisse sowie die speziellen Einträge „ . “ und „ .. “ werden standardmäßig nicht aufgelistet. |
QDirListing::IteratorFlag::ExcludeFiles | 0x000004 | Keine regulären Dateien auflisten. In Kombination mit „ResolveSymlinks“ werden auch symbolische Links zu regulären Dateien ausgeschlossen. |
QDirListing::IteratorFlag::ExcludeDirs | 0x000008 | Verzeichnisse werden nicht aufgelistet. In Kombination mit „ResolveSymlinks“ werden auch symbolische Links zu Verzeichnissen ausgeschlossen. |
QDirListing::IteratorFlag::ExcludeOther | 0x000010 | [seit 6.10] Keine Dateisystem-Einträge auflisten, die keine Verzeichnisse, regulären Dateien oder symbolischen Links sind.
|
QDirListing::IteratorFlag::ResolveSymlinks | 0x000020 | Symbollinks werden anhand des Typs des Ziels des Links gefiltert, nicht anhand des Symbollinks selbst. Defekte Symbollinks (bei denen das Ziel nicht existiert) werden ausgeschlossen; setze „IncludeBrokenSymlinks“, um sie einzubeziehen. Dieses Flag wird auf Betriebssystemen ignoriert, die keine Symbollinks unterstützen. |
QDirListing::IteratorFlag::IncludeBrokenSymlinks | 0x001000 | [seit 6.11] Listet defekte symbolische Links auf, bei denen das Ziel nicht existiert, unabhängig vom Status des Flags „ResolveSymlinks“. Dieses Flag wird auf Betriebssystemen ignoriert, die keine symbolischen Links unterstützen. |
QDirListing::IteratorFlag::FilesOnly | ExcludeDirs | ExcludeOther | Es werden nur reguläre Dateien aufgelistet. In Kombination mit „ResolveSymlinks“ werden auch symbolische Verweise auf Dateien aufgelistet. |
QDirListing::IteratorFlag::DirsOnly | ExcludeFiles | ExcludeOther | Es werden nur Verzeichnisse aufgelistet. In Kombination mit „ResolveSymlinks“ werden auch symbolische Links zu Verzeichnissen aufgelistet. |
QDirListing::IteratorFlag::IncludeHidden | 0x000040 | Versteckte Einträge auflisten. In Kombination mit „Recursive“ wird die Iteration auch in versteckte Unterverzeichnisse rekursiv durchgeführt. |
QDirListing::IteratorFlag::IncludeDotAndDotDot | 0x000080 | Die speziellen Einträge „ . “ und „ .. “ auflisten. |
QDirListing::IteratorFlag::CaseSensitive | 0x000100 | Die Dateimuster in den Namensfiltern, die an den Konstruktor von „ QDirListing “ übergeben werden, werden unter Berücksichtigung der Groß-/Kleinschreibung abgeglichen (Einzelheiten finden Sie unter „ QDir::setNameFilters “ ()). |
QDirListing::IteratorFlag::Recursive | 0x000400 | Listet auch Einträge in allen Unterverzeichnissen auf. In Kombination mit „FollowDirSymlinks“ werden auch symbolische Links zu Verzeichnissen durchlaufen. |
QDirListing::IteratorFlag::FollowDirSymlinks | 0x000800 | In Kombination mit „Recursive“ werden auch symbolische Links zu Verzeichnissen durchlaufen. Schleifen bei symbolischen Links (z. B. link => . oder link => ..) werden automatisch erkannt und ignoriert. |
Der Typ „IteratorFlags“ ist ein „typedef“ für „QFlags<IteratorFlag>“. Er speichert eine ODER-Kombination von „IteratorFlag“-Werten.
Dokumentation der Mitgliedsfunktionen
[explicit] QDirListing::QDirListing(const QString &path, QDirListing::IteratorFlags flags = IteratorFlag::Default)
Erstellt ein `QDirListing`, das ` path` durchlaufen kann.
Sie können über ` flags ` Optionen übergeben, um zu steuern, wie das Verzeichnis durchlaufen werden soll.
Standardmäßig lautet „ flags “ „ IteratorFlag::Default “.
Siehe auch „ IteratorFlags “.
[explicit] QDirListing::QDirListing(const QString &path, const QStringList &nameFilters, QDirListing::IteratorFlags flags = IteratorFlag::Default)
Erstellt ein `QDirListing`, das ` path` durchlaufen kann.
Sie können über flags Optionen übergeben, um zu steuern, wie das Verzeichnis durchlaufen werden soll. Standardmäßig lautet flags „ IteratorFlag::Default “.
Die aufgelisteten Einträge werden gemäß den Dateimuster-Regeln in ` nameFilters` gefiltert, die mithilfe von ` QRegularExpression::fromWildcard ` in einen regulären Ausdruck umgewandelt werden (weitere Details finden Sie unter ` QDir::setNameFilters()`).
Beispielsweise könnte der folgende Iterator verwendet werden, um Audio-Dateien zu durchlaufen:
QDirListing audioFileIt(u"/home/johndoe/"_s, QStringList{u"*.mp3"_s, u"*.wav"_s},
QDirListing::IteratorFlag::FilesOnly);Manchmal lässt sich die Filterung nach Namen effizienter durchführen, indem man die Einträge mit einer `range-for`-Schleife durchläuft und dabei Zeichenfolgenvergleiche nutzt. Zum Beispiel:
using F = QDirListing::IteratorFlag;
const auto flags = F::FilesOnly | F::Recursive | F::ResolveSymlinks;
for (const auto &dirEntry : QDirListing(u"/usr"_s, flags)) {
// Faster than using name filters, filter ".txt" and ".html" files
// using QString API
const QString fileName = dirEntry.fileName();
if (fileName.endsWith(".txt"_L1) || fileName.endsWith(".html"_L1)) {
// ...
}
}
}Siehe auch IteratorFlags und QDir::setNameFilters().
[noexcept] QDirListing::QDirListing(QDirListing &&other)
Move-Konstruktor. Verschiebt „ other “ in dieses „QDirListing“.
Hinweis: Das verschobene Objekt „ other “ befindet sich in einem teilweise initialisierten Zustand, in dem die einzigen zulässigen Operationen die Zerstörung und die Zuweisung eines neuen Werts sind.
[noexcept] QDirListing::~QDirListing()
Zerstört den „ QDirListing “.
QDirListing::const_iterator QDirListing::begin() const
QDirListing::const_iterator QDirListing::cbegin() const
QDirListing::sentinel QDirListing::cend() const
QDirListing::sentinel QDirListing::end() const
(c) `begin()` gibt ein ` QDirListing::const_iterator ` zurück, mit dem die Verzeichniseinträge durchlaufen werden können.
- Es handelt sich um einen Iterator, der nur vorwärts und in einem Durchgang arbeitet (Verzeichniseinträge können nicht in umgekehrter Reihenfolge durchlaufen werden)
- Kann nicht kopiert werden, nur
std::move()d. - Der Rückgabewert der Postinkrementierung bei Objekten, die
std::input_iteratorimplementieren, ist unvollständig (eine Kopie eines Iterators, der inzwischen weitergeschritten ist); die einzigen gültigen Operationen für ein solches Objekt sind die Zerstörung und die Zuweisung eines neuen Iterators. Daher schreitet der Postinkrement-Operator den Iterator voran und gibtvoidzurück. - Erlaubt keinen Direktzugriff
- Kann in `for-range`-Schleifen verwendet werden oder mit C++20-`std::ranges`-Algorithmen, die keine Iteratoren mit wahlfreiem Zugriff erfordern
- Die Dereferenzierung eines gültigen Iterators gibt einen
const DirEntry & - (c) `end()` gibt einen ` QDirListing::sentinel ` zurück, der das Ende der Iteration signalisiert. Die Dereferenzierung eines Iterators, der mit ` end()` gleich ist, führt zu undefiniertem Verhalten
Hinweis: Bei jedem Aufruf von (c) `begin()` für dasselbe ` QDirListing `-Objekt wird der interne Zustand zurückgesetzt und die Iteration beginnt von Neuem.
(Einige der oben genannten Einschränkungen ergeben sich aus der Implementierung der zugrunde liegenden Systembibliotheksfunktionen).
Beispiel:
using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry: QDirListing(u"/etc"_s, ItFlag::Recursive)) {
qDebug() << dirEntry.filePath();
// /etc/.
// /etc/..
// /etc/X11
// /etc/X11/fs
// ...
}So können Sie alle Dateien, die nach Namen gefiltert wurden, rekursiv finden und lesen:
mit F = QDirListing::IteratorFlag;
QDirListing dirList(u"/sys"_s, QStringList{u"scaling_cur_freq"_s}, F::FilesOnly | F::Recursive);
for (const auto &dirEntry: dirList) {
QFile f(dirEntry.filePath());
if (f.open(QIODevice::ReadOnly))
qDebug() << f.fileName() << f.readAll().trimmed().toDouble() / 1000 << "MHz";
}Hinweis: Die „klassischen“ STL-Algorithmen unterstützen keine Iteratoren/Sentinel, daher müssen Sie für ` QDirListing` die C++20-Algorithmen von `std::ranges` verwenden oder eine Bibliothek eines Drittanbieters, die bereichsbasierte Algorithmen in C++17 bereitstellt.
Siehe auch QDirListing::DirEntry.
QDirListing::IteratorFlags QDirListing::iteratorFlags() const
Gibt die Menge der „ IteratorFlags “ zurück, die zur Erstellung dieses „ QDirListing “ verwendet wurden.
QString QDirListing::iteratorPath() const
Gibt den Verzeichnispfad zurück, der zum Erstellen dieses QDirListing verwendet wurde.
QStringList QDirListing::nameFilters() const
Gibt die Liste der Dateinamen-Glob-Filter zurück, die zum Erstellen dieses ` QDirListing` verwendet wurden.
[noexcept] QDirListing &QDirListing::operator=(QDirListing &&other)
Durch die Verschiebung wird other diesem QDirListing zugewiesen.
Hinweis: Das verschobene Objekt other befindet sich in einem teilweise initialisierten Zustand, in dem die einzigen zulässigen Operationen die Zerstörung und die Zuweisung eines neuen Werts sind.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.