Chcę rekursywnie skanować katalog i wszystkie jego podkatalogi pod kątem plików z określonym rozszerzeniem - na przykład wszystkich plików * .jpg. Jak możesz to zrobić w Qt?Rekurencyjnie iteruj po wszystkich plikach w katalogu i jego podkatalogach w Qt
Odpowiedz
Proponuję rzucić okiem na QDirIterator.
QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
qDebug() << it.next();
Dzięki temu algorytm jest bardziej skalowalny. QDir::entryList()
może zająć nagle dużą ilość pamięci, gdy wiele plików jest przechowywanych w jednym katalogu. Niedobrze na małych urządzeniach wbudowanych.
Zmarnowałem dużo czasu, ponieważ nie czytałem oficjalnych dokumentów. Uwaga: "Po zakończeniu budowy, iterator znajduje się przed pierwszym wpisem do katalogu Funkcja' next() 'zwraca ścieżkę do następnej pozycji katalogu i przesuwa iterator." Twój kod, który zajmuje się plikami, powinien pojawić się po 'it.next()'. –
To powinno działać:
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));
}
}
Różnice z kodu są następujące:
- przeszukiwanie wszerz zamiast głębokość pierwszego wyszukiwania (bez względu na to, po prostu wolą)
- Więcej filtrów w celu uniknięcia linków symycznych
- Element EntryList zamiast EntryInfoList. Nie potrzebujesz, jeśli chcesz tylko nazwę pliku.
ja testowałem to i działa poprawnie, ale występują następujące objawy:
- To może zająć dużo czasu, więc rozważyć uruchomienie go z nici
- Jeśli jest głęboko rekurencji może masz problem ze swoim stosem
O ile czegoś nie brakuje, zmieniłeś wyjście swojej funkcji. Chce mieć listę wszystkich plików w podanym katalogu, a twoja funkcja wydrukuje tylko nazwy plików, ale nie dostarczy listy. –
Nie wypełniał listy ciągów "nutFiles', więc nie zawarłem tej części. Łatwo jest jednak zmodyfikować funkcję i uzyskać listę wszystkich plików – pnezis
Użyłem QDirIterator.
Oto jak to zrobić i jak łatwo było znaleźć wszystkie ścieżki bezwzględne plik XML rekurencyjnie bardzo szybko (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());
}
}
Dzięki wszystkim za podpowiedzi.
EDYCJA: Mogłem pominąć niektóre deklaracje, uważaj.
Wystrzegaj się trafień wydajnościowych z QDirIterator. –
- 1. Przejdź się rekurencyjnie do katalogu w Qt, pomiń foldery "." i ".."
- 2. list.files() wszystkie pliki w katalogu i podkatalogach
- 3. Jak mogę utworzyć listę plików w bieżącym katalogu i jego podkatalogach z określonym rozszerzeniem?
- 4. katalogu Delete rekurencyjnie w Scala
- 5. Scala - Iterator na wszystkich liniach w plikach w katalogu
- 6. Jak rekurencyjnie przetestować wszystkie skrzynie w katalogu?
- 7. Rekurencyjnie uzyskanie rozmiaru katalogu
- 8. Reguła Makefile, która zależy od wszystkich plików w katalogu (w tym w podkatalogach)
- 9. iteruj po właściwościach klasy php
- 10. Rekurencyjnie scp oprócz bieżącego katalogu
- 11. Dodaj grupę "Wszyscy" do katalogu i wszystkich jego podkatalogów.
- 12. Gitignore wykluczyć niektóre pliki we wszystkich podkatalogach
- 13. Qt, CMake, Visual Studio i Q_OBJECT w plikach cpp
- 14. Zwraca liczbę plików w katalogu i podkatalogu
- 15. Perl: Rekurencyjnie zmień nazwę wszystkich plików i katalogów.
- 16. QMake: Automatyczne kompilowanie wszystkich plików w katalogu
- 17. Plik wsadowy Windows - Łącz wszystkie pliki w podkatalogach
- 18. Gradle - Rekurencyjnie uwzględnij projekt zewnętrzny i jego podprojekty
- 19. iteruj statyczne wartości int w java
- 20. Co rozszerza się do wszystkich plików w bieżącym katalogu rekursywnie?
- 21. Policz numer konkretnego typu pliku katalogu i jego podkatalogu w mac
- 22. Lista wszystkich folderów w katalogu
- 23. Wyszukaj ciąg wewnątrz nazwy pliku w podkatalogach
- 24. Zastąp ciąg we wszystkich plikach w Eclipse
- 25. Pliki wsadowe: Lista wszystkich plików w katalogu o ścieżkach względnych
- 26. Listuj wszystkie pliki (z pełnymi ścieżkami) w katalogu (i podkatalogach), uporządkuj według czasu dostępu
- 27. Czytanie plików Android.mk w podkatalogach rekursywnie
- 28. Rysowanie widoku i wszystkich jego dzieci
- 29. Vim: Trudności z ustawianiem ctags. Źródło w podkatalogach nie widzi pliku znaczników w katalogu głównym projektu
- 30. Filtrowanie katalogu i wszystkich podkatalogów w Google Analytics
Ponadto, Qt ma obiekt QFileSystemModel, który możesz rozważyć zaglądając do – Chris