2012-08-28 14 views
6

Tengo un pequeño problema al usar las funciones de Qt para recorrer un directorio recursivamente. Lo que estoy tratando de hacer:Camina un directorio de forma recursiva en Qt, omite las carpetas "." y ".."

Abra un directorio específico. Paseo por el directorio, y cada vez que encuentra otro directorio, abra ese directorio, caminar a través de los archivos, etc.

Ahora, cómo voy sobre esto:

QString dir = QFileDialog::getExistingDirectory(this, "Select directory"); 
if(!dir.isNull()) { 
    ReadDir(dir); 
} 

void Mainwindow::ReadDir(QString path) { 
    QDir dir(path);       //Opens the path 
    QFileInfoList files = dir.entryInfoList(); //Gets the file information 
    foreach(const QFileInfo &fi, files) {  //Loops through the found files. 
     QString Path = fi.absoluteFilePath(); //Gets the absolute file path 
     if(fi.isDir()) ReadDir(Path);   //Recursively goes through all the directories. 
     else { 
      //Do stuff with the found file. 
     } 
    } 
} 

Ahora, el problema real Me enfrento: Naturalmente, entryInfoList también devolvería el '.' y directorios '..'. Con esta configuración, esto demuestra un problema importante.

Al entrar en '.', Pasará por todo el directorio dos veces, o incluso infinitamente (porque '.' Siempre es el primer elemento), con '..' reharía el proceso para todas las carpetas debajo del directorio de padres.

Me gustaría hacer esto bien y elegante, ¿hay alguna manera de hacer esto, no estoy al tanto? O es la única manera, que obtengo el nombre de archivo simple (sin la ruta) y lo compruebo con '.' y '..'?

Respuesta

12

Debe intentar utilizar el filtro QDir::NoDotAndDotDot en su entryInfoList, como se describe en el documentation.

EDITAR

  • No se olvide de añadir un QDir::Files o QDir::Dirs o QDir::AllFiles para recoger los archivos y/o directorios, como se describe in this post.

  • También es posible que desee comprobar this previous question.

+0

Sí, y como se describe [aquí] (http://www.qtcentre.org/threads/19085-QDir-entryInfoList-and-NoDotAndDotDot-filter), el intervalo QT es necesario que haya QDir, y el filtro necesita ser expandido con QDir :: AllEntries. Todavía estás obteniendo lo "correcto", porque me apuntaste en la dirección correcta. Gracias :) – ATaylor

+0

Thx, actualicé la respuesta en consecuencia. –

Cuestiones relacionadas