2012-10-24 35 views
1

我試圖讓所有的文件夾中,遞歸,但它看起來愚蠢,集名稱僅過濾的文件,而不是在顯示目錄

如果我使用setNameFilters,將過濾的文件夾名稱爲好,這樣如果文件夾內沒有文件,但只有子文件夾,則循環將失敗。所以現在我正在做內部循環兩次,一次是找到沒有名稱過濾器的所有子文件夾;一個用於所有帶名稱過濾器的文件。

梳理它們的正確方法是什麼?我想所有的文件夾,也應該符合過濾器(如果這是在循環中的文件或文件夾,我會判斷)

QStringList FileFind::dir2files(const QString &path) 
{ 
    QStringList files; 

    QStack<QString> stack; 
    stack.push(path); 

    while (! stack.isEmpty()) 
    { 
     QDir dir (stack.top()); 
     stack.pop(); 

     foreach (const QFileInfo & fileInfo, 
       dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs)) 
     { 
      stack.push_back(fileInfo.absoluteFilePath()); 
     } 

     dir.setNameFilters(_nameFilters); 

     foreach (const QFileInfo & fileInfo, 
       dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files)) 
     { 
      files.append(fileInfo.absoluteFilePath()); 
     } 
    } 

    return files; 
} 

回答

0

雖然我不會描述這個爲一體的「正確的方法」中的所有文件,我想你會最終有一個清潔的解決方案,如果你遞歸遞歸調用您的dir2files成員函數(您使用QStack的管理目錄是第一個線索):

QStringList FileFind::dir2files(const QString& path) 
{ 
    QStringList files; 
    dir2fileshelper(path, files, 0); 
    return files; 
} 

void FileFind::dir2fileshelper(const QString& path, 
           QStringList& files, 
           int currentDepth) 
{ 
    static const int MAXIMUM_DEPTH = 40; // For example 
    if (currentDepth >= MAXIMUM_DEPTH) 
    { 
     qWarning("Maximum directory depth limit reached."); 
     return; 
    } 

    QDir directory(path); 

    QFileInfoList list = directory.entryInfoList(QDir::NoDotAndDotDot | 
               QDir::Dirs | 
               QDir::Files); 

    foreach (const QFileInfo& fileInfo, list) 
    { 
     if (fileInfo.isDir()) 
     { 
     dir2fileshelper(fileInfo.absoluteFilePath(), files, currentDepth+1); 
     } 
     else 
     { 
     files << fileInfo.absoluteFilePath(); 
     } 
    } 
} 

更新:添加的代碼限制遞歸深度並限制QStringList複製。

+0

如果我這樣做,我不應該擔心有限的堆棧大小(即限制遞歸深度)嗎? – daisy

+0

@ warl0ck是的,你可能會遇到一個非常深的目錄樹的堆棧溢出。處理它的唯一方法是要麼堅持原來的實現(對於深層的目錄樹會使用大量內存,但希望不會崩潰),或者對遞歸深度設置限制(我已經編輯了我的答案顯示這個)。這是您必須在可讀性和資源使用關注點之間進行選擇的領域之一。 –

相關問題