Auf dieser Seite

Portierung von QDirIterator auf QDirListing

In Qt 6.8 wurde „ QDirListing “ als effizienterer Ersatz für „ QDirIterator “ hinzugefügt (letzteres ist vorerst weiterhin verfügbar). Auf dieser Seite werden einige Punkte hervorgehoben, die bei der Portierung von „ QDirIterator “ auf „ QDirListing “ zu beachten sind.

Mit QDirIterator können Sie mithilfe von Flags aus zwei separaten Enumeratoren, QDirIterator::IteratorFlags und QDir::Filters, steuern, welche Einträge aufgelistet werden, während QDirListing über einen einzigen Satz von Flags verfügt, um diese Aufgabe zu bewältigen.

Die Portierung von QDirIterator::IteratorFlags auf QDirListing::IteratorFlags ist unkompliziert:

Die Portierung von QDir::Filters auf QDirListing::IteratorFlags kann komplexer sein, je nachdem, welche bitweise ODER-Kombination von QDir::Filters Sie verwenden.

  • Standardmäßig listet ` QDirListing ` Verzeichnisse, reguläre Dateien, symbolische Links und spezielle (sonstige) Dateisystem-Einträge auf; Sie können Einträge anhand ihres Typs ausschließen, indem Sie die verschiedenen `QDirListing::IteratorFlag::Exclude*`-Flags verwenden.
  • QDirDer Standardfilter lautet „ QDir::AllEntries “, was folgendem entspricht:
    using F = QDirListing::IteratorFlag;
    QDirListing::IteratorFlags(F::ExcludeOther|F::ResolveSymlinks|F::IncludeDotAndDotDot);
  • Standardmäßig listet ` QDirListing ` (Windows-)Laufwerke auf, daher gibt es kein Äquivalent für ` QDir::Drives`.
  • QDir::Readable, „ QDir::Writable “, „ QDir::Executable “ und „ QDir::AllDirs “: In „ QDirListing “ gibt es keine entsprechenden Flags. Wenn Sie diese Funktionalität benötigen, durchlaufen Sie die Einträge mit einer range-for-Schleife und filtern Sie nach Bedarf.
    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 “ wurden die Semantiken von „ QDir::NoDot “, „ QDir::NoDotDot “ und „ QDir::NoDotAndDotDot “ in einem einzigen Flag zusammengefasst. Standardmäßig listet „ QDirListing “ die speziellen Einträge „ . “ und „ .. “ nicht auf. Setzen Sie „ QDirListing::IteratorFlag::IncludeDotAndDotDot “, um sie aufzulisten.

Standardmäßig löst QDirIterator symbolische Links auf, sofern nicht QDir::NoSymlinks gesetzt ist, während QDirListing symbolische Links nur auflöst, wenn QDirListing::IteratorFlag::ResolveSymlinks gesetzt ist; in diesem Fall erfolgt die Filterung anhand des Typs des Ziels des symbolischen Links und nicht anhand des symbolischen Links selbst. Um beispielsweise nur reguläre Dateien und symbolische Links zu regulären 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` an (z. B. `fileName()`, `filePath()`, `exists()`). Der Hauptvorteil der API von `DirEntry` besteht darin, die (relativ aufwendigen) Aufrufe von ` stat() ` oder ` lstat() ` zu verzögern, wenn wir die benötigten Informationen bereits auf andere Weise erhalten haben. Unter Linux verwenden wir beispielsweise intern `readdir()`, um eine Verzeichnisstruktur zu durchlaufen, und erhalten dabei den Namen und den Typ des Eintrags als Teil der zurückgegebenen Informationen. Wenn Sie also lediglich den Dateinamen benötigen, verwenden Sie ` QDirListing::DirEntry::fileName()` anstelle von ` QDirListing::DirEntry::fileInfo()`.fileName() (QDirListing erstellt intern ein ` QFileInfo ` und nutzt dieses bei Bedarf transparent).

© 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.