Auf dieser Seite

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

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

KonstanteWertBeschreibung
QDirListing::IteratorFlag::Default0x000000Alle 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::ExcludeFiles0x000004Keine regulären Dateien auflisten. In Kombination mit „ResolveSymlinks“ werden auch symbolische Links zu regulären Dateien ausgeschlossen.
QDirListing::IteratorFlag::ExcludeDirs0x000008Verzeichnisse werden nicht aufgelistet. In Kombination mit „ResolveSymlinks“ werden auch symbolische Links zu Verzeichnissen ausgeschlossen.
QDirListing::IteratorFlag::ExcludeOther0x000010[seit 6.10] Keine Dateisystem-Einträge auflisten, die keine Verzeichnisse, regulären Dateien oder symbolischen Links sind.
  • Unter Unix ist ein spezieller (anderer) Dateisystemeintrag ein FIFO, ein Socket, ein Zeichen- oder ein Blockgerät. Weitere Details finden Sie in der mknod Man-Seite.
  • Unter Windows gelten (aus historischen Gründen) „ .lnk “-Dateien als spezielle (sonstige) Dateisystemeinträge.
QDirListing::IteratorFlag::ResolveSymlinks0x000020Symbollinks 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::IncludeBrokenSymlinks0x001000[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::FilesOnlyExcludeDirs | ExcludeOtherEs werden nur reguläre Dateien aufgelistet. In Kombination mit „ResolveSymlinks“ werden auch symbolische Verweise auf Dateien aufgelistet.
QDirListing::IteratorFlag::DirsOnlyExcludeFiles | ExcludeOtherEs werden nur Verzeichnisse aufgelistet. In Kombination mit „ResolveSymlinks“ werden auch symbolische Links zu Verzeichnissen aufgelistet.
QDirListing::IteratorFlag::IncludeHidden0x000040Versteckte Einträge auflisten. In Kombination mit „Recursive“ wird die Iteration auch in versteckte Unterverzeichnisse rekursiv durchgeführt.
QDirListing::IteratorFlag::IncludeDotAndDotDot0x000080Die speziellen Einträge „ . “ und „ .. “ auflisten.
QDirListing::IteratorFlag::CaseSensitive0x000100Die 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::Recursive0x000400Listet auch Einträge in allen Unterverzeichnissen auf. In Kombination mit „FollowDirSymlinks“ werden auch symbolische Links zu Verzeichnissen durchlaufen.
QDirListing::IteratorFlag::FollowDirSymlinks0x000800In 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_iterator implementieren, 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 gibt void zurü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.