QDirListing Class
Die Klasse QDirListing bietet einen STL-ähnlichen Iterator für Verzeichniseinträge. Mehr...
Kopfzeile: | #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 Input/Output und Networking.
Öffentliche Typen
class | DirEntry |
(since 6.8) class | const_iterator |
(since 6.8) class | sentinel |
enum class | IteratorFlag { Default, ExcludeFiles, ExcludeDirs, ExcludeSpecial, 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) |
Detaillierte Beschreibung
Sie können QDirListing verwenden, um die Einträge eines Verzeichnisses nacheinander aufzulisten. Es ist ähnlich wie QDir::entryList() und QDir::entryInfoList(), aber da es die Einträge einzeln auflistet, anstatt alle auf einmal, skaliert es besser und ist besser für große Verzeichnisse geeignet. Es unterstützt auch das rekursive Auflisten von Verzeichnisinhalten und das Verfolgen von symbolischen Links. Im Gegensatz zu QDir::entryList() unterstützt QDirListing keine Sortierung.
Der QDirListing-Konstruktor nimmt eine Verzeichnispfadzeichenkette als Argument. Hier wird beschrieben, wie man rekursiv über alle Einträge iteriert:
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 finden und lesen Sie alle regulären Dateien nach Namen gefiltert, rekursiv:
using 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 lassen sich nur reguläre Dateien auflisten, und zwar rekursiv:
using F = QDirListing::IteratorFlag; const auto flags = F::FilesOnly | F::Recursive; for (const auto &dirEntry : QDirListing(u"/etc"_s, flags)) { // ... }
So listen Sie nur reguläre Dateien und symbolische Links auf reguläre Dateien auf, rekursiv:
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 Modelle C++20 std::input_iterator, d.h. es ist ein move-only, forward-only, single-pass Iterator, der keinen zufälligen Zugriff erlaubt. Er kann in Ranged-for-Schleifen verwendet werden (oder mit C++20 Range-Algorithmen, die keine Iteratoren mit wahlfreiem Zugriff erfordern). Die Dereferenzierung eines gültigen Iterators gibt ein QDirListing::DirEntry Objekt zurück. Der Sentinel (c)end() markiert das Ende der Iteration. Das Dereferenzieren eines Iterators, der gleich sentinel ist, ist undefiniertes Verhalten.
QDirListing::DirEntry bietet eine Teilmenge der API von QFileInfo(z. B. fileName(), filePath(), exists()). Intern konstruiert DirEntry nur bei Bedarf ein QFileInfo Objekt, d.h. wenn die Informationen nicht bereits von anderen Systemfunktionen abgerufen wurden. Sie können DirEntry::fileInfo() verwenden, um ein QFileInfo zu erhalten. 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 der Mitgliedstypen
enum class QDirListing::IteratorFlag
flags QDirListing::IteratorFlags
Diese Enum-Klasse beschreibt Flags, die verwendet werden können, um das Verhalten von QDirListing zu konfigurieren. Werte aus diesem Enumerator können bitweise miteinander ODER-verknüpft werden.
Konstante | Wert | Beschreibung |
---|---|---|
QDirListing::IteratorFlag::Default | 0x000000 | Listet alle Dateien, Verzeichnisse und symbolischen Links auf, einschließlich defekter Symlinks (bei denen das Ziel nicht existiert). Versteckte Dateien und Verzeichnisse sowie die speziellen Einträge . und .. werden standardmäßig nicht aufgelistet. |
QDirListing::IteratorFlag::ExcludeFiles | 0x000004 | Reguläre Dateien werden nicht aufgelistet. In Kombination mit ResolveSymlinks werden auch symbolische Links auf reguläre Dateien ausgeschlossen. |
QDirListing::IteratorFlag::ExcludeDirs | 0x000008 | Verzeichnisse nicht auflisten. In Kombination mit ResolveSymlinks werden auch symbolische Links auf Verzeichnisse ausgeschlossen. |
QDirListing::IteratorFlag::ExcludeSpecial | 0x000010 | Spezielle Systemdateien nicht auflisten:
|
QDirListing::IteratorFlag::ResolveSymlinks | 0x000020 | Filtert symbolische Links auf der Grundlage des Typs des Ziels des Links und nicht des symbolischen Links selbst. Mit diesem Flag werden defekte symbolische Links (bei denen das Ziel nicht existiert) ausgeschlossen. Dieses Flag wird auf Betriebssystemen, die symbolische Links nicht unterstützen, ignoriert. |
QDirListing::IteratorFlag::FilesOnly | ExcludeDirs | ExcludeSpecial | Es werden nur reguläre Dateien aufgelistet. In Kombination mit ResolveSymlinks werden auch symbolische Links auf Dateien aufgelistet. |
QDirListing::IteratorFlag::DirsOnly | ExcludeFiles | ExcludeSpecial | Es werden nur Verzeichnisse aufgelistet. In Kombination mit ResolveSymlinks werden auch symbolische Links auf Verzeichnisse aufgelistet. |
QDirListing::IteratorFlag::IncludeHidden | 0x000040 | Versteckte Einträge auflisten. In Kombination mit Recursive wird die Iteration auch in versteckte Unterverzeichnisse rekursieren. |
QDirListing::IteratorFlag::IncludeDotAndDotDot | 0x000080 | Die speziellen Einträge . und .. auflisten. |
QDirListing::IteratorFlag::CaseSensitive | 0x000100 | Die Datei-glob-Muster in den Namensfiltern, die an den QDirListing -Konstruktor übergeben werden, werden unter Berücksichtigung der Groß- und Kleinschreibung abgeglichen (für Details siehe QDir::setNameFilters()). |
QDirListing::IteratorFlag::Recursive | 0x000400 | Listet auch Einträge in allen Unterverzeichnissen auf. In Kombination mit FollowDirSymlinks werden auch symbolische Links auf Verzeichnisse iteriert. |
QDirListing::IteratorFlag::FollowDirSymlinks | 0x000800 | In Kombination mit Recursive werden auch symbolische Links auf Verzeichnisse iteriert. Symbolische Linkschleifen (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
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 eine QDirListing::const_iterator zurück, die zur Iteration über Verzeichniseinträge verwendet werden kann.
- Es handelt sich um einen Iterator, der nur vorwärts läuft (Sie können die Verzeichniseinträge nicht in umgekehrter Reihenfolge durchlaufen).
- Kann nicht kopiert werden, nur
std::move()
d. - Der Rückgabewert von post-increment auf Objekten, die
std::input_iterator
modellieren, ist teilweise geformt (eine Kopie eines Iterators, der seither weitergeschaltet wurde), die einzigen gültigen Operationen auf einem solchen Objekt sind Zerstörung und Zuweisung eines neuen Iterators. Daher schiebt der Post-Increment-Operator den Iterator vor und gibtvoid
zurück. - Erlaubt keinen zufälligen Zugriff
- Kann in ranged-for-Schleifen verwendet werden; oder mit C++20 std::ranges-Algorithmen, die keine Iteratoren mit wahlfreiem Zugriff erfordern
- Die Dereferenzierung eines gültigen Iterators gibt ein
const DirEntry &
- (c)end() gibt eine QDirListing::sentinel zurück, die das Ende der Iteration signalisiert. Das Dereferenzieren eines Iterators, der gleich end() vergleicht, ist undefiniertes Verhalten
Hinweis: Jedes Mal, wenn (c)begin() auf demselben QDirListing Objekt aufgerufen wird, wird der interne Zustand zurückgesetzt und die Iteration beginnt von neuem.
(Einige der oben genannten Einschränkungen werden durch die Implementierung der zugrunde liegenden Systembibliotheksfunktionen diktiert).
Ein 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 finden und lesen Sie alle nach Namen gefilterten Dateien, rekursiv:
using 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 C++20 std::ranges-Algorithmen für QDirListing oder eine Bibliothek eines Drittanbieters verwenden, die bereichsbasierte Algorithmen in C++17 bereitstellt.
Siehe auch QDirListing::DirEntry.
[explicit]
QDirListing::QDirListing(const QString &path, QDirListing::IteratorFlags flags = IteratorFlag::Default)
Konstruiert ein QDirListing, das über path iterieren kann.
Sie können Optionen über flags übergeben, um zu steuern, wie das Verzeichnis iteriert werden soll.
Standardmäßig ist flags IteratorFlag::Default .
Siehe auch IteratorFlags.
[explicit]
QDirListing::QDirListing(const QString &path, const QStringList &nameFilters, QDirListing::IteratorFlags flags = IteratorFlag::Default)
Konstruiert ein QDirListing, das über path iterieren kann.
Sie können Optionen über flags übergeben, um zu steuern, wie das Verzeichnis iteriert werden soll. Standardmäßig ist flags gleich IteratorFlag::Default.
Die aufgelisteten Einträge werden nach den Dateiglob-Mustern in nameFilters gefiltert (siehe QDir::setNameFilters() für weitere Details).
Zum Beispiel könnte der folgende Iterator verwendet werden, um über Audiodateien zu iterieren:
QDirListing audioFileIt(u"/home/johndoe/"_s, QStringList{u"*.mp3"_s, u"*.wav"_s}, QDirListing::IteratorFlag::FilesOnly);
Siehe auch IteratorFlags und QDir::setNameFilters().
[noexcept]
QDirListing::QDirListing(QDirListing &&other)
Verschieben-Konstruktor. Verschiebt other in dieses QDirListing.
Hinweis: Das verschobene Objekt other wird in einen teilweise gebildeten Zustand versetzt, in dem die einzigen gültigen Operationen Zerstörung und Zuweisung eines neuen Wertes sind.
[noexcept]
QDirListing::~QDirListing()
Zerstört die QDirListing.
QDirListing::IteratorFlags QDirListing::iteratorFlags() const
Gibt die Menge von IteratorFlags zurück, die für die Erstellung dieser QDirListing verwendet wurde.
QString QDirListing::iteratorPath() const
Gibt den Verzeichnispfad zurück, der für die Erstellung dieses QDirListing verwendet wurde.
QStringList QDirListing::nameFilters() const
Gibt die Liste der Dateinamen-Glob-Filter zurück, die für die Erstellung dieser QDirListing verwendet wurden.
[noexcept]
QDirListing &QDirListing::operator=(QDirListing &&other)
Verschieben - weist other diesem QDirListing zu.
Hinweis: Das verschobene Objekt other wird in einen teilweise gebildeten Zustand versetzt, in dem die einzigen gültigen Operationen die Zerstörung und die Zuweisung eines neuen Wertes sind.
© 2025 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.