1

フォルダー内のすべてのファイルを再帰的に取得しようとしていますが、ばかげているように見えます。

を使用するsetNameFiltersと、フォルダー名もフィルター処理されるため、フォルダー内にファイルがなく、サブフォルダーのみがある場合、ループは失敗します。そのため、現在、内部ループを 2 回実行しています。1 つは、名前フィルターを使用せずにすべてのサブフォルダーを検索するためです。名前フィルターを持つすべてのファイルに対して 1 つ。

それらを梳く正しい方法は何ですか?すべてのフォルダー、およびフィルターに準拠するすべてのファイルが必要です (そして、ループ内のファイルまたはフォルダーであるかどうかを判断します)

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これを「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();
      }
   }
}

更新:再帰の深さを制限し、QStringListコピーを制限するコードを追加しました。

于 2012-10-24T17:17:31.477 に答える