2011-11-08 47 views

Trả lời

67

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

+6

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()'. –

5

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
+0

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

+0

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

3

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.

+0

Hãy cảnh giác với các lần truy cập hiệu suất từ ​​QDirIterator. –

Các vấn đề liên quan