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;
}
4

1 回答 1

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复制的代码。

于 2012-10-24T17:17:31.477 回答