Sur cette page

Portage de QDirIterator en QDirListing

Dans Qt 6.8, QDirListing a été ajouté en tant que remplacement plus efficace de QDirIterator (ce dernier est toujours disponible pour l'instant). Cette page souligne quelques points à garder à l'esprit lors du portage de QDirIterator vers QDirListing.

Avec QDirIterator, vous pouvez contrôler quelles entrées sont listées en utilisant les drapeaux de deux énumérateurs distincts, QDirIterator::IteratorFlags et QDir::Filters, alors que QDirListing dispose d'un seul jeu de drapeaux pour gérer cette tâche.

Le portage de QDirIterator::IteratorFlags vers QDirListing::IteratorFlags est simple :

Le portage de QDir::Filters vers QDirListing::IteratorFlags peut s'avérer plus complexe, en fonction de la combinaison OU bit à bit de QDir::Filters que vous utilisez.

  • Par défaut, QDirListing liste les répertoires, les fichiers normaux, les liens symboliques et les entrées spéciales(autres) du système de fichiers ; vous pouvez exclure des entrées en fonction de leur type en utilisant les différents drapeaux QDirListing::IteratorFlag::Exclude*.
  • QDirLe filtre par défaut de QDirListing::IteratorFlag::Exclude* est QDir::AllEntries, ce qui équivaut à :
    using F = QDirListing::IteratorFlag;
    QDirListing::IteratorFlags(F::ExcludeOther|F::ResolveSymlinks|F::IncludeDotAndDotDot);
  • Par défaut, QDirListing répertorie les lecteurs (Windows), il n'y a donc pas d'équivalent pour QDir::Drives.
  • QDir::Readable QDir::Writable QDir::Executable QDir::AllDirsIl n'y a pas de drapeaux équivalents dans QDirListing. Si vous avez besoin de cette fonctionnalité, itérez sur les entrées avec une boucle de type "range-for" et filtrez selon vos besoins.
    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)) {
            ...
        }
    }
  • Avec QDirListing, la sémantique de QDir::NoDot, QDir::NoDotDot et QDir::NoDotAndDotDot a été combinée en un seul indicateur. Par défaut, QDirListing ne liste pas les entrées spéciales . et ... Définissez QDirListing::IteratorFlag::IncludeDotAndDotDot pour qu'elles soient listées.

Par défaut, QDirIterator résout les liens symboliques à moins que QDir::NoSymlinks ne soit défini, tandis que QDirListing ne résout pas les liens symboliques à moins que QDirListing::IteratorFlag::ResolveSymlinks ne soit défini, auquel cas le filtrage est effectué sur la base du type de la cible du lien symbolique, et non du lien symbolique lui-même. Par exemple, pour ne lister que les fichiers normaux et les liens symboliques vers des fichiers normaux, vous devez définir QDirListing::IteratorFlag::FilesOnly et 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 offre un sous-ensemble de l'API de QFileInfo(par exemple, fileName(), filePath(), exists()). Le principal avantage de l'API DirEntry est de retarder les appels (plutôt coûteux) à stat() ou lstat() si nous avons déjà obtenu les informations nécessaires par d'autres moyens. Sous Linux, par exemple, nous utilisons en interne readdir() pour parcourir l'arborescence d'un répertoire, et nous obtenons le nom et le type de l'entrée dans les informations retournées. Donc, si tout ce que vous voulez est le nom du fichier, utilisez QDirListing::DirEntry::fileName() au lieu de QDirListing::DirEntry::fileInfo().fileName() (QDirListing construira un QFileInfo en interne et l'utilisera de manière transparente si nécessaire).

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