Portierung von QDirIterator auf QDirListing
In Qt 6.8 wurde QDirListing als effizienterer Ersatz für QDirIterator hinzugefügt (letzteres ist zur Zeit noch verfügbar). Diese Seite hebt einige Punkte hervor, die bei der Portierung von QDirIterator auf QDirListing zu beachten sind.
Mit QDirIterator können Sie steuern, welche Einträge aufgelistet werden, indem Sie die Flags von zwei separaten Enumeratoren, QDirIterator::IteratorFlags und QDir::Filters, verwenden, während QDirListing einen Satz von Flags hat, um diese Aufgabe zu erledigen.
Die Portierung von QDirIterator::IteratorFlags auf QDirListing::IteratorFlags ist unkompliziert:
- QDirListing::IteratorFlag::Default ist äquivalent zu QDirIterator::NoIteratorFlags
- QDirListing::IteratorFlag::FollowDirSymlinks ist gleichbedeutend mit QDirIterator::FollowSymlinks
- QDirListing::IteratorFlag::Recursive ist gleichbedeutend mit QDirIterator::Subdirectories
Die Portierung von QDir::Filters auf QDirListing::IteratorFlags kann komplexer sein, je nachdem, welche bitweise ODER-verknüpfte Kombination von QDir::Filters Sie verwenden.
- Standardmäßig listet QDirListing Verzeichnisse, reguläre Dateien, symbolische Links und spezielle(andere) Dateisystemeinträge auf; Sie können Einträge basierend auf ihrem Typ ausschließen, indem Sie die verschiedenen QDirListing::IteratorFlag::Exclude*-Flags verwenden.
- QDirDer Standardfilter von QDirListing::IteratorFlag::Exclude* ist QDir::AllEntries, was gleichbedeutend ist mit:
using F = QDirListing::IteratorFlag; QDirListing::IteratorFlags(F::ExcludeOther|F::ResolveSymlinks|F::IncludeDotAndDotDot);
- Standardmäßig listet QDirListing (Windows-)Laufwerke auf, daher gibt es keine Entsprechung für QDir::Drives.
- QDir::Readable QDir::Writable, und : Es gibt keine äquivalenten Flags in . Wenn Sie diese Funktionalität benötigen, iterieren Sie über die Einträge mit einer Range-for-Schleife und filtern Sie nach Bedarf. QDir::Executable QDir::AllDirs QDirListing
QDirIterator dit(dirPath, QDir::AllEntries | QDir::Readable | QDir::Executable | QDir::NoDotAndDotDot); while (dit.hasNext()) { const QFileInfo fi = dit.nextFileInfo(); fileNames.append(fi.fileName()); ... } using F = QDirListing::IteratorFlags; for (const auto &dirEntry : QDirListing(dirPath, F::Default)) { const QFileInfo fi = dirEntry.fileInfo(); // Filter based on readable and executable bits if (fi.isReadable() && fi.isExecutable()) { fileNames.append(dirEntry.fileName()); ... } }
// QDir::AllDirs causes dirs to always be listed regardless of `nameFilters`; // for example, to list ".so" files in a file dialog and still list all dirs: QDirIterator dit(dirPath, nameFilters, QDir::AllDirs | QDir::NoDotAndDotDot); while (dit.hasNext()) { const QFileInfo fi = dit.nextFileInfo(); ... } // Equivalent code using QDirListing: using F = QDirListing::IteratorFlags; for (const auto &dirEntry : QDirListing(dirPath, F::Default)) { const QFileInfo fi = dirEntry.fileInfo(); if (fi.isDir() || fi.fileName().endsWith(".so"_L1)) { ... } }
- Mit QDirListing wurde die Semantik von QDir::NoDot, QDir::NoDotDot und QDir::NoDotAndDotDot in einem Flag zusammengefasst. In der Voreinstellung listet QDirListing die speziellen Einträge
.
und..
nicht auf. Setzen Sie QDirListing::IteratorFlag::IncludeDotAndDotDot, um sie aufzulisten.
Symbolische Links
Standardmäßig löst QDirIterator symbolische Links auf, es sei denn, QDir::NoSymlinks ist gesetzt, während QDirListing symbolische Links nicht auflöst, es sei denn, QDirListing::IteratorFlag::ResolveSymlinks ist gesetzt. In diesem Fall erfolgt die Filterung auf der Grundlage des Typs des Ziels des symbolischen Links, nicht des symbolischen Links selbst. Um zum Beispiel nur reguläre Dateien und symbolische Links auf reguläre Dateien aufzulisten, müssen Sie QDirListing::IteratorFlag::FilesOnly und QDirListing::IteratorFlag::ResolveSymlinks setzen.
// Symbolic links are resolved by default QDirIterator dit(dirPath, QDir::Files | QDir::NoDotAndDotDot); while (dit.hasNext()) { const QFileInfo fi = dit.nextFileInfo(); fileNames.append(fi.fileName()); ... } // To preserve the behavior of the code above, set ResolveSymlinks: using F = QDirListing::IteratorFlags; for (const auto &dirEntry : QDirListing(dirPath, F::FilesOnly | F::ResolveSymlinks)) { fileNames.append(dirEntry.fileName()); ... }
QDirListing::DirEntry
QDirListing::DirEntry bietet eine Teilmenge der API von QFileInfo(zum Beispiel fileName(), filePath(), exists()). Der Hauptvorteil der API von DirEntry ist die Verzögerung der (ziemlich teuren) Aufrufe von stat()
oder lstat()
, wenn wir die benötigten Informationen bereits auf andere Weise erhalten haben. Unter Linux zum Beispiel verwenden wir intern readdir(), um einen Verzeichnisbaum zu durchlaufen, und wir erhalten den Namen und den Typ des Eintrags als Teil der zurückgegebenen Informationen. Wenn Sie also nur den Dateinamen benötigen, verwenden Sie QDirListing::DirEntry::fileName() anstelle von QDirListing::DirEntry::fileInfo().fileName() (QDirListing erstellt intern eine QFileInfo und verwendet diese bei Bedarf transparent).
© 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.