仅在文件上设置名称过滤器,而不是在dirs上

时间:2012-10-24 14:34:23

标签: qt4

我试图以递归方式获取文件夹中的所有文件,但它看起来很愚蠢,

如果我使用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;
}

1 个答案:

答案 0 :(得分:0)

虽然我不会将其描述为“一种真实的方式”,但我认为如果递归地递归调用dir2files成员函数(使用{{1}),我将会得到更清晰的解决方案。管理目录是第一个线索):

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(); } } } 复制的代码。