2012-10-24 52 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是的,你可能会遇到一个非常深的目录树的堆栈溢出。处理它的唯一方法是要么坚持原来的实现(对于深层的目录树会使用大量内存,但希望不会崩溃),或者对递归深度设置限制(我已经编辑了我的答案显示这个)。这是您必须在可读性和资源使用关注点之间进行选择的领域之一。 –

相关问题