Sur cette page

Portage de QDirIterator vers QDirListing

Dans Qt 6.8, QDirListing a été ajouté pour remplacer de manière plus efficace QDirIterator (ce dernier est toujours disponible pour l'instant). Cette page met en avant certains points à garder à l'esprit lors du portage de QDirIterator vers QDirListing.

Avec QDirIterator, vous pouvez contrôler les entrées affichées à l’aide d’indicateurs provenant de deux énumérateurs distincts, QDirIterator::IteratorFlags et QDir::Filters, tandis que QDirListing dispose d’un seul ensemble d’indicateurs pour gérer cette tâche.

Le portage de QDirIterator::IteratorFlags vers QDirListing::IteratorFlags est très simple :

Le portage de QDir::Filters vers QDirListing::IteratorFlags peut s’avérer plus complexe, selon la combinaison obtenue par OU binaire de QDir::Filters que vous utilisez.

  • Par défaut, QDirListing répertorie les répertoires, les fichiers ordinaires, 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 à l’aide des différents indicateurs QDirListing::IteratorFlag::Exclude*.
  • QDirLe filtre par défaut 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'existe donc pas d'équivalent pour ` QDir::Drives`.
  • QDir::Readable, QDir::Writable, QDir::Executable et QDir::AllDirs: il n’existe pas d’indicateurs équivalents dans QDirListing. Si vous avez besoin de cette fonctionnalité, parcourez les entrées à l’aide d’une boucle « range-for » et filtrez-les 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 `, les sémantiques de ` QDir::NoDot`, ` QDir::NoDotDot ` et ` QDir::NoDotAndDotDot ` ont été regroupées en un seul indicateur. Par défaut, ` QDirListing ` ne répertorie pas les entrées spéciales ` . ` et ` ..`. Définissez ` QDirListing::IteratorFlag::IncludeDotAndDotDot ` pour les afficher.

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 s’effectue en fonction du type de la cible du lien symbolique, et non du lien symbolique lui-même. Par exemple, pour afficher uniquement les fichiers ordinaires et les liens symboliques vers des fichiers ordinaires, 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 propose un sous-ensemble de l’API de ` QFileInfo` (par exemple, `fileName()`, `filePath()`, `exists()`). Le principal avantage de l’API de `DirEntry` est de différer 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 la fonction `readdir()` pour parcourir une arborescence de répertoires, et le nom ainsi que le type de l’entrée font partie des informations renvoyées. Ainsi, si vous souhaitez uniquement obtenir le nom du fichier, utilisez ` QDirListing::DirEntry::fileName()` plutôt que ` QDirListing::DirEntry::fileInfo()`.fileName() (la fonction `QDirListing ` créera en interne un objet ` QFileInfo ` et l’utilisera de manière transparente lorsque cela sera 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.