2012-08-28 9 views
6

Mam małe problemy z używaniem funkcji Qt do przechodzenia przez katalog rekursywnie. Co próbuję wykonać:Przejdź się rekurencyjnie do katalogu w Qt, pomiń foldery "." i ".."

Otwórz określony katalog. Spacer po katalogu i za każdym razem napotka inny katalog, należy otworzyć ten katalog, chodzić plików itp

Teraz, jak idę na ten temat:

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

Teraz rzeczywisty problem Mam do czynienia: Oczywiście, entryInfoList również zwróci wartość "." i katalogi "..". Dzięki tej konfiguracji jest to poważny problem.

Po przejściu do "." Przejrzałaby cały katalog dwa razy lub nawet nieskończenie (ponieważ "." Jest zawsze pierwszym elementem), z ".." ponawiałoby proces dla wszystkich folderów pod nadrzędna Lokalizacja.

Chciałbym zrobić to ładne i eleganckie, czy jest jakiś sposób, aby przejść o tym, nie jestem świadomy? Lub jest to jedyny sposób, że otrzymuję zwykłą nazwę pliku (bez ścieżki) i sprawdzam, czy jest to znak "." i '..'?

Odpowiedz

12

Powinieneś spróbować użyć filtru QDir::NoDotAndDotDot w swoim entryInfoList, jak opisano w documentation.

EDIT

  • Nie zapomnij dodać QDir::Files lub QDir::Dirs lub QDir::AllFiles odebrać pliki i/lub katalogi, jak opisano in this post.

  • Możesz również chcieć sprawdzić this previous question.

+0

Tak, i jak opisano [tutaj] (http://www.qtcentre.org/threads/19085-QDir-entryInfoList-and-NoDotAndDotDot-filter), QT musi być QDir, a filtr należy rozszerzyć o QDir :: AllEntries. Wciąż dostajesz "poprawne", ponieważ wskazałeś mi właściwy kierunek. Dziękuję :) – ATaylor

+0

Thx, zaktualizowałem odpowiedź odpowiednio. –