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