2012-08-28 10 views
6

Ho un piccolo problema nell'usare le funzioni Qt per scorrere ricorsivamente una directory. Cosa sto cercando di fare:Cammina una directory in modo ricorsivo in Qt, salta le cartelle "." e ".."

Aprire una directory specificata. Passeggiata attraverso la directory, e ogni volta che incontra un'altra directory, aprire la directory, a piedi attraverso i file, ecc

Ora, come sto andando a questo:

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. 
     } 
    } 
} 

Ora, il problema reale Sto affrontando: Naturalmente, entryInfoList restituirà anche il '.' e ".." directory. Con questa configurazione, questo è un grosso problema.

Entrando in ".", Passerebbe attraverso l'intera directory due volte o anche infinitamente (perché "." È sempre il primo elemento), con ".." si rifarebbe il processo per tutte le cartelle sotto il directory principale.

Mi piacerebbe fare questo bello ed elegante, c'è un modo per farlo, non ne sono a conoscenza? O è l'unico modo per ottenere il nome file semplice (senza il percorso) e controllare quello con '.' e '..'?

risposta

12

Si dovrebbe provare a utilizzare il filtro QDir::NoDotAndDotDot nel proprio entryInfoList, come descritto nello documentation.

EDIT

  • Non dimenticare di aggiungere un QDir::Files, o QDir::Dirs o QDir::AllFiles per raccogliere i file e/o directory, come descritto in this post.

  • Si consiglia inoltre di controllare this previous question.

+0

Sì, e come descritto [qui] (http://www.qtcentre.org/threads/19085-QDir-entryInfoList-and-NoDotAndDotDot-filter), il QT deve essere QDir, e il filtro deve essere ampliato con QDir :: AllEntries. Stai ancora ottenendo il 'corretto', perché mi hai indicato nella giusta direzione. Grazie :) – ATaylor

+0

Thx, ho aggiornato la risposta di conseguenza. –

Problemi correlati