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?iterar recursivamente sobre todos los archivos en un directorio y sus subdirectorios en Qt
Respuesta
Le 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()
podría tomar repentinamente una gran cantidad de memoria cuando muchos archivos están almacenados en un solo directorio. No es bueno en pequeños dispositivos integrados.
Perdí mucho tiempo porque no leía los documentos oficiales correctamente. Tenga en cuenta que "después de la construcción, el iterador se encuentra antes de la primera entrada del directorio. La función' next() 'devuelve la ruta a la siguiente entrada de directorio y avanza el iterador". Entonces su código que trata con los archivos debe venir después de 'it.next()'. –
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 respecto a su código son los siguientes:
- búsqueda en anchura en lugar de primera búsqueda en profundidad (no hay razón para ello, sólo lo prefieran)
- 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 que observe lo siguiente:
- Este proceso puede tardar mucho tiempo, por lo que considerar ejecutarlo a partir de hilos
- Si hay recursividad profunda es posible que tenga problema con su pila
A menos que me falta algo, ha cambiado la salida de su función. Él quiere la lista de todos los archivos en el directorio dado, mientras que su función solo imprimirá los nombres de los archivos, pero no proporcionará la lista. –
No estaba llenando la lista de cadenas 'nutFiles', así que no incluí esta parte. Sin embargo, es bastante fácil modificar la función y obtener la lista de todos los archivos. – pnezis
Utilicé QDirIterator.
Así es como lo hago y lo fácil que era encontrar todas las rutas de archivos XML de forma recursiva absolutos 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.
Tenga cuidado con los resultados de rendimiento de QDirIterator. –
- 1. Listar los archivos en un directorio y todos los subdirectorios
- 2. Listar todos los archivos y directorios en un directorio + subdirectorios
- 3. Forma no recursiva de obtener todos los archivos en un directorio y sus subdirectorios en Java
- 4. Agregue el grupo "Todos" al directorio y todos sus subdirectorios
- 5. Cómo obtener archivos en un directorio, incluidos todos los subdirectorios
- 6. Iterar todos los archivos en un directorio usando BOOST_FOREACH
- 7. TCL: buscar recursivamente subdirectorios para obtener todos los archivos .tcl
- 8. Recursivamente incluyendo todos los subdirectorios modelo
- 9. ¿Cómo crear recursivamente un directorio en Qt?
- 10. CoffeeScript: compila todos los archivos .coffee en el directorio actual y en todos los subdirectorios
- 11. Eliminar carpeta y todos los archivos/subdirectorios
- 12. Convierte todo EOL (dos-> unix) de todos los archivos en un directorio y subdirectorios recursivamente sin dos2unix
- 13. Difiere un directorio recursivamente, Ignorando todos los archivos binarios:
- 14. ¿Cómo puedo iterar sobre archivos en un directorio determinado?
- 15. Cómo descomprimir todos los archivos en todos los subdirectorios en bash
- 16. Liste de manera eficiente todos los subdirectorios en un directorio
- 17. Hacer ejecutables todos los archivos PHP (recursivamente)
- 18. cómo listar todos los subdirectorios en un directorio
- 19. Cómo gzip todos los archivos en todos los subdirectorios en un archivo comprimido en bash
- 20. ¿Qué se expande a todos los archivos en el directorio actual recursivamente?
- 21. ¿Cómo recursivamente usar JpegTran (línea de comando) para optimizar todos los archivos en subdirectorios?
- 22. git: ¿Cómo puedo agregar recursivamente todos los archivos en un subárbol de directorio que coinciden con un patrón global?
- 23. Cómo recursivamente enumerar todos los archivos en un directorio en C#?
- 24. ¿Cómo iterar archivos recursivamente en Groovy?
- 25. Obtener rutas absolutas de todos los archivos en un directorio
- 26. Eliminar todos los archivos en un directorio sin subdirectorios con Apache Ant
- 27. Python: enumere todos los nombres de archivo en un directorio y sus subdirectorios y luego imprima los resultados en un archivo de texto
- 28. lista LINUX recursivamente todos los archivos en un directorio incluyendo los archivos en directorios de enlaces simbólicos
- 29. Listar todos los archivos (con rutas completas) en un directorio (y subdirectorios), ordenar por tiempo de acceso
- 30. Iterar sobre todos los valores dobles posibles
Además, Qt tiene un objeto QFileSystemModel que es posible que desee considerar buscando en – Chris