una subcarpetas recorrer manejo listar libreria fichero estructura dirent directorios directorio dentro crear carpeta archivos arbol c++ qt

subcarpetas - manejo de directorios c++



Iterar recursivamente sobre todos los archivos en un directorio y sus subdirectorios en Qt (3)

Quiero escanear recursivamente un directorio y todos sus subdirectorios para archivos con una extensión dada, por ejemplo, todos los archivos * .jpg. ¿Cómo puedes hacer eso en Qt?


Esto debería funcionar :

void scanDir(QDir dir) { dir.setNameFilters(QStringList("*.nut")); dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks); qDebug() << "Scanning: " << dir.path(); QStringList fileList = dir.entryList(); for (int i=0; i<fileList.count(); i++) { if(fileList[i] != "main.nut" && fileList[i] != "info.nut") { qDebug() << "Found file: " << fileList[i]; } } dir.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks); QStringList dirList = dir.entryList(); for (int i=0; i<dirList.size(); ++i) { QString newPath = QString("%1/%2").arg(dir.absolutePath()).arg(dirList.at(i)); scanDir(QDir(newPath)); } }

Las diferencias con su código son las siguientes:

  • Búsqueda de amplitud en lugar de búsqueda de profundidad en primer lugar (no hay razón para eso, solo lo prefiero)
  • Más filtros para evitar enlaces simbólicos
  • EntryList en lugar de EntryInfoList. No lo necesita si solo quiere el nombre del archivo.

Lo probé y funciona correctamente, pero tenga en cuenta lo siguiente:

  • Esto puede llevar mucho tiempo, así que considere ejecutarlo desde el hilo
  • Si hay recursión profunda, puede tener problemas con su pila

Sugiero que eche un vistazo a QDirIterator .

QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories); while (it.hasNext()) qDebug() << it.next();

Esto hace que el algoritmo sea más escalable. QDir::entryList() puede tomar de repente una gran cantidad de memoria cuando muchos archivos están almacenados en un solo directorio. No es bueno en pequeños dispositivos integrados.


Usé QDirIterator.

Así es como lo hago y lo simple que fue encontrar todas las rutas XML absolutas de archivos recursivamente muy rápido (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()); } }

Gracias a todos por los consejos.

EDITAR: Pude haber omitido algunas declaraciones, ten cuidado.