Tôi muốn đệ quy quét thư mục và tất cả thư mục con của nó cho các tệp có đuôi mở rộng nhất định - ví dụ: tất cả các tệp * .jpg. Làm thế nào bạn có thể làm điều đó trong Qt?Đệ quy lặp qua tất cả các tệp trong thư mục và thư mục con của nó trong Qt
Trả lời
Tôi khuyên bạn nên xem QDirIterator.
QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
qDebug() << it.next();
Điều này làm cho thuật toán có thể mở rộng hơn. QDir::entryList()
có thể mất một lượng lớn bộ nhớ khi nhiều tệp được lưu trữ trong một thư mục duy nhất. Không tốt trên các thiết bị nhúng nhỏ.
Tôi lãng phí rất nhiều thời gian vì không đọc tài liệu chính thức đúng cách. Xin lưu ý "Sau khi xây dựng, trình vòng lặp được đặt trước mục nhập thư mục đầu tiên. Hàm' next() 'trả về đường dẫn đến mục nhập thư mục tiếp theo và tiến hành trình lặp." Vì vậy, mã của bạn giao dịch với các tệp phải đến sau 'it.next()'. –
này nên làm việc:
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));
}
}
Sự khác biệt từ mã của bạn như sau:
- Chiều rộng tìm kiếm đầu tiên thay vì tìm kiếm theo chiều sâu (không có lý do cho nó, tôi chỉ thích nó)
- Các bộ lọc khác để tránh các liên kết đối tượng
- EntryList thay vì EntryInfoList. Bạn không cần nếu bạn chỉ muốn tên của tập tin.
Tôi đã thử nghiệm nó và nó hoạt động một cách chính xác, nhưng chú ý những điều sau:
- này có thể mất rất nhiều thời gian, vì vậy xem xét việc chạy nó từ chủ đề
- Nếu có đệ quy sâu bạn có thể có vấn đề với ngăn xếp của bạn
Trừ khi tôi thiếu một cái gì đó, bạn đã thay đổi đầu ra của chức năng của mình. Anh ta muốn danh sách tất cả các tệp trong thư mục đã cho, trong khi chức năng của bạn sẽ chỉ in tên tệp nhưng sẽ không cung cấp danh sách. –
Anh ta không điền vào danh sách chuỗi 'nutFiles', vì vậy tôi không bao gồm phần này. Nó khá dễ dàng mặc dù để sửa đổi các chức năng và nhận được danh sách tất cả các tập tin – pnezis
Tôi đã sử dụng QDirIterator.
Đây là cách tôi làm điều đó và làm thế nào đơn giản nó là để tìm tất cả XML đường dẫn tập tin tuyệt đối đệ quy rất nhanh (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());
}
}
Nhờ mọi người cho các gợi ý.
EDIT: Tôi có thể đã bỏ qua một số tuyên bố, hãy cẩn thận.
Hãy cảnh giác với các lần truy cập hiệu suất từ QDirIterator. –
- 1. bash lặp qua tất cả tìm đệ quy trong thư mục con
- 2. Liệt kê tất cả các tệp và thư mục trong thư mục + thư mục con
- 3. Đọc các tệp Android.mk trong thư mục con đệ quy
- 4. Xóa thư mục và tất cả các tệp/thư mục con
- 5. TCL: Tìm kiếm đệ quy các thư mục con để nguồn tất cả các tệp .tcl
- 6. Cách đếm tất cả các tệp trong một thư mục, thư mục con của nó và tất cả. Số đếm không được bao gồm số thư mục
- 7. Danh sách tất cả thư mục và thư mục con
- 8. Làm thế nào để đệ quy đi qua tất cả các thư mục con và đọc tệp?
- 9. Xóa đệ quy các tệp và thư mục trong C#
- 10. Liệt kê các tệp trong thư mục và tất cả thư mục con
- 11. Thực hiện đệ quy trong các thư mục con
- 12. Tìm tất cả các tệp .php trong thư mục đệ quy
- 13. Làm thế nào để bạn lặp qua tất cả các tệp/thư mục đệ quy trong C++ chuẩn?
- 14. Lấy danh sách tất cả các tệp trong thư mục (đệ quy)
- 15. Lặp lại mọi tệp .jpg hoặc .jpeg trong thư mục và thư mục con
- 16. lặp qua các thư mục con
- 17. Git bỏ qua tất cả trừ thư mục con
- 18. CoffeeScript - biên dịch tất cả các tệp .coffee trong thư mục hiện tại và tất cả các thư mục con
- 19. Điều gì mở rộng cho tất cả các tệp trong thư mục hiện tại đệ quy?
- 20. Cách đệ quy liệt kê tất cả các tệp và thư mục
- 21. Cách gzip tất cả các tệp trong tất cả các thư mục con trong bash
- 22. Cách tạo một hàm đệ quy để sao chép tất cả các tệp và thư mục
- 23. Danh sách các tệp trong thư mục nội dung và thư mục con của nó
- 24. Tạo một thư mục con cho tất cả các thư mục trong thư mục
- 25. Linux đệ quy chmod chỉ trên các thư mục con
- 26. Diff Một thư mục đệ quy, bỏ qua tất cả các tập tin nhị phân:
- 27. Bash: scp tất cả các tệp trong một thư mục, nhưng không phải thư mục con
- 28. Cách nhận tệp trong thư mục, bao gồm tất cả các thư mục con
- 29. Lọc trên thư mục và tất cả các thư mục con trong Google Analytics
- 30. Tệp Android.mk - bao gồm tất cả các tệp nguồn trong các thư mục và thư mục khác nhau
Ngoài ra, Qt có một đối tượng QFileSystemModel mà bạn có thể muốn xem xét xem xét – Chris