54 votes

Itérer récursivement sur tous les fichiers d'un répertoire et ses sous-répertoires dans Qt

Je souhaite analyser de manière récursive un répertoire et tous ses sous-répertoires à la recherche de fichiers avec une extension donnée - par exemple, tous les fichiers *.jpg. Comment pouvez-vous faire cela dans Qt ?

4voto

J'ai utilisé QDirIterator.

Voici comment je procède et à quel point il était simple de trouver tous les chemins de fichiers absolus XML de manière récursive très rapide (Qt4.8.1) :

 // used to store the file paths
filesStack = new QStack<QString>();

// I use a file dialog to let the user choose the root folder to search in
if (fileDialog->exec() == QFileDialog::Accepted) {
    QDir selectedDir(fileDialog->selectedFiles().first());
    selectedDir.setFilter(QDir::Files |
                          QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
    QStringList qsl; qsl.append("*.xml"); // I only want XML files
    selectedDir.setNameFilters(qsl);
    findFilesRecursively(selectedDir);
}

// this function stores the absolute paths of each file in a QVector
void findFilesRecursively(QDir rootDir) {
    QDirIterator it(rootDir, QDirIterator::Subdirectories);
    while(it.hasNext()) {
        filesStack->push(it.next());
    }
}

Merci à tous pour les pistes.

EDIT : J'ai peut-être omis certaines déclarations, méfiez-vous.

0voto

MangoCat Points 49

Un autre exemple qui indexe tous les fichiers, en utilisant QFileInfo :

 void ID3Tab::scanDir( QDir dir )
{ QFileInfoList fil = dir.entryInfoList( QStringList( "*.mp3" ),
                                         QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks,
                                         QDir::Name | QDir::IgnoreCase );
  foreach ( QFileInfo fi, fil )
    indexFile( fi );

  QFileInfoList dil = dir.entryInfoList( QStringList( "*" ),
                                         QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks,
                                         QDir::Name | QDir::IgnoreCase );
  foreach ( QFileInfo di, dil )
    scanDir( QDir( di.absoluteFilePath() ) );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X