Qt4 仅在文件上设置名称筛选器,而不在目录上设置名称筛选器

Qt4 仅在文件上设置名称筛选器,而不在目录上设置名称筛选器,qt4,Qt4,我试图递归地获取文件夹中的所有文件,但这看起来很愚蠢 如果我使用setNameFilters,它也会过滤文件夹名,因此如果文件夹中没有文件,只有子文件夹,循环就会失败。所以现在我做了两次内部循环,一次用于查找没有名称过滤器的所有子文件夹;一个用于具有名称筛选器的所有文件 梳理它们的正确方法是什么?我想要所有文件夹,以及所有符合过滤器的文件(我将判断它是循环中的文件还是文件夹) QStringList FileFind::dir2files(常量QString&path) { QStringLis

我试图递归地获取文件夹中的所有文件,但这看起来很愚蠢

如果我使用
setNameFilters
,它也会过滤文件夹名,因此如果文件夹中没有文件,只有子文件夹,循环就会失败。所以现在我做了两次内部循环,一次用于查找没有名称过滤器的所有子文件夹;一个用于具有名称筛选器的所有文件

梳理它们的正确方法是什么?我想要所有文件夹,以及所有符合过滤器的文件(我将判断它是循环中的文件还是文件夹)

QStringList FileFind::dir2files(常量QString&path)
{
QStringList文件;
QStack堆栈;
stack.push(路径);
而(!stack.isEmpty())
{
QDir目录(stack.top());
stack.pop();
foreach(const QFileInfo和fileInfo,
目录入口信息列表(QDir::NoDotAndDotDot | QDir::Dirs))
{
stack.push_back(fileInfo.absoluteFilePath());
}
目录setNameFilters(_nameFilters);
foreach(const QFileInfo和fileInfo,
目录入口信息列表(QDir::NoDotAndDotDot | QDir::Files))
{
append(fileInfo.absoluteFilePath());
}
}
归还文件;
}

虽然我不会将此描述为“一种真正的方式”,但我认为如果递归调用
dir2files
成员函数,您将得到一个更干净的解决方案(您使用
QStack
管理目录是第一个线索):

QStringList FileFind::dir2files(常量QString&path)
{
QStringList文件;
dir2fileshelper(路径,文件,0);
归还文件;
}
void FileFind::dir2fileshelper(常量QString和path,
QStringList和文件,
int(当前深度)
{
static const int max_DEPTH=40;//例如
如果(当前深度>=最大深度)
{
qWarning(“已达到最大目录深度限制”);
返回;
}
QDir目录(path);
QFileInfoList=目录.entryInfoList(QDir::NodeAndDotDotDot |
QDir::Dirs|
QDir::文件);
foreach(const QFileInfo和fileInfo,列表)
{
if(fileInfo.isDir())
{
dir2fileshelper(fileInfo.absoluteFilePath(),文件,currentDepth+1);
}
其他的
{

如果我这样做,我不应该担心有限的堆栈大小(这会限制递归深度吗?@warl0ck是的,对于非常深的目录树,您可能会遇到堆栈溢出。唯一的处理方法是要么坚持原始实现(对于深目录树,这将使用大量内存,但希望不会崩溃)或者限制递归深度(我已经编辑了我的答案来说明这一点)。这是您必须在可读性和资源使用问题之间进行选择的领域之一。
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;
}
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();
      }
   }
}