递归迭代Qt中目录及其子目录中的所有文件

Dim*_*mse 44 c++ qt

我想以递归方式扫描目录及其所有子目录以查找具有给定扩展名的文件 - 例如,所有*.jpg文件.你怎么能在Qt那样做?

Luc*_*lon 88

我建议你看看QDirIterator.

QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
    qDebug() << it.next();
Run Code Online (Sandbox Code Playgroud)

这使得算法更具可扩展性.QDir::entryList()当许多文件存储在单个目录中时,可能会突然占用大量内存.小型嵌入式设备不太好用.

  • 我浪费了很多时间,因为没有正确阅读官方文档.请注意"构造之后,迭代器位于第一个目录条目之前.`next()`函数返回下一个目录条目的路径并推进迭代器." 因此,处理文件的代码应该在`it.next()之后. (9认同)

pne*_*zis 7

这应该工作:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

与您的代码的不同之处如下:

  • 宽度优先搜索而不是深度优先搜索(没有理由,我只是喜欢它)
  • 更多过滤器以避免sym链接
  • EntryList而不是EntryInfoList.如果您只想要文件的名称,则不需要.

我测试了它并且它正常工作,但请注意以下内容:

  • 这可能需要很长时间,因此请考虑从线程运行它
  • 如果存在深度递归,则可能存在堆栈问题