En esta página

Portar QDirIterator a QDirListing

En Qt 6.8 se añadió QDirListing como reemplazo más eficiente de QDirIterator (este último sigue disponible por ahora). Esta página resalta algunos puntos a tener en cuenta al portar QDirIterator a QDirListing.

Con QDirIterator puede controlar qué entradas se listan usando banderas de dos enumeradores separados, QDirIterator::IteratorFlags y QDir::Filters, mientras que QDirListing tiene un conjunto de banderas para manejar esta tarea.

La migración de QDirIterator::IteratorFlags a QDirListing::IteratorFlags es sencilla:

La conversión de QDir::Filters a QDirListing::IteratorFlags puede ser más compleja, dependiendo de la combinación OR bitwise de QDir::Filters que se utilice.

  • Por defecto, QDirListing lista directorios, ficheros normales, enlaces simbólicos y entradas especiales(otras) del sistema de ficheros; puede excluir entradas basándose en su tipo usando los distintos indicadores QDirListing::IteratorFlag::Exclude*.
  • QDirEl filtro por defecto de QDirListing::IteratorFlag::Exclude* es QDir::AllEntries, que es equivalente a:
    using F = QDirListing::IteratorFlag;
    QDirListing::IteratorFlags(F::ExcludeOther|F::ResolveSymlinks|F::IncludeDotAndDotDot);
  • Por defecto, QDirListing lista unidades (Windows), por lo que no hay equivalente para QDir::Drives.
  • QDir::Readable, QDir::Writable, QDir::Executable, y QDir::AllDirs: No hay banderas equivalentes en QDirListing. Si necesita esta funcionalidad, itere sobre las entradas con un bucle range-for y filtre según sea necesario.
    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)) {
            ...
        }
    }
  • Con QDirListing, la semántica de QDir::NoDot, QDir::NoDotDot y QDir::NoDotAndDotDot se ha combinado en un indicador. Por defecto, QDirListing no lista las entradas especiales . y ... Configure QDirListing::IteratorFlag::IncludeDotAndDotDot para listarlas.

Por defecto, QDirIterator resuelve enlaces simbólicos a menos que QDir::NoSymlinks esté configurado, mientras que QDirListing no resuelve enlaces simbólicos a menos que QDirListing::IteratorFlag::ResolveSymlinks esté configurado, en cuyo caso el filtrado se realiza basándose en el tipo de destino del enlace simbólico, no en el enlace simbólico en sí. Por ejemplo, para listar sólo ficheros normales y enlaces simbólicos a ficheros normales, debe configurar QDirListing::IteratorFlag::FilesOnly y QDirListing::IteratorFlag::ResolveSymlinks.

// 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 ofrece un subconjunto de la API de QFileInfo(por ejemplo, fileName(), filePath(), exists()). La principal ventaja de la API de DirEntry es que retrasa las (bastante caras) llamadas a stat() o lstat() si ya tenemos la información necesaria por otros medios. En Linux, por ejemplo, internamente usamos readdir() para iterar sobre un árbol de directorios, y obtenemos el nombre y tipo de la entrada como parte de la información devuelta. Así que si todo lo que quieres es el nombre del archivo usa, QDirListing::DirEntry::fileName() en lugar de QDirListing::DirEntry::fileInfo().fileName() (QDirListing construirá un QFileInfo internamente y lo usará de forma transparente cuando sea necesario).

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