2011-11-08 11 views

答えて

67

私はあなたがQDirIteratorを見てみることをお勧めします。

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

これによりアルゴリズムのスケーラビリティが向上します。 QDir::entryList()は、多くのファイルが1つのディレクトリに格納されているときに突然大きなメモリ容量を消費することがあります。小型の組み込み機器ではうまくいかない

+6

公式ドキュメントを正しく読んでいないため、時間が無駄になりました。 "next()関数は次のディレクトリエントリへのパスを返し、イテレータを進めます。"ですから、ファイルを取り扱うコードは 'it.next()'の後に来るべきです。 –

5

これは動作するはずです:あなたのコードから

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

相違点は次のとおりです。代わりに、深さ優先探索の

  • 幅優先探索(そのための理由はないが、私はちょうどそれを好む)
  • シンボリックリンクを避けるためのフィルタの追加
  • EntryInfoListではなくEntryList。ファイルの名前だけが必要な場合は必要ありません。

私はそれをテストし、それが正常に動作しますが、次のように注意してください:

  • これは多くの時間がかかるので、あなたが持つかもしれない深い再帰がある場合は、スレッド
  • からそれを実行することを検討しますあなたのスタックの問題
+0

何かが見つからない限り、彼の機能の出力を変更しました。彼は指定されたディレクトリ内のすべてのファイルのリストを望んでいますが、関数はファイル名だけを出力しますが、リストは出力しません。 –

+0

彼は 'nutFiles'文字列リストを埋めていないので、私はこの部分を含めませんでした。関数を修正してすべてのファイルのリストを取得するのはかなり簡単ですが、 – pnezis

3

QDirIteratorを使用しました。

は、ここで私はそれを行うとどのようにシンプルそれは(Qt4.8.1)を再帰的に非常に速く、すべてのXMLファイルの絶対パスを見つけることだった方法は次のとおりです。ヒントのためにすべての人に

// used to store the file paths 
filesStack = new QStack<QString>(); 

// I use a file dialog to let the user choose the root folder to search in 
if (fileDialog->exec() == QFileDialog::Accepted) { 
    QDir selectedDir(fileDialog->selectedFiles().first()); 
    selectedDir.setFilter(QDir::Files | 
          QDir::Dirs | QDir::NoDot | QDir::NoDotDot); 
    QStringList qsl; qsl.append("*.xml"); // I only want XML files 
    selectedDir.setNameFilters(qsl); 
    findFilesRecursively(selectedDir); 
} 

// this function stores the absolute paths of each file in a QVector 
void findFilesRecursively(QDir rootDir) { 
    QDirIterator it(rootDir, QDirIterator::Subdirectories); 
    while(it.hasNext()) { 
     filesStack->push(it.next()); 
    } 
} 

感謝。

編集:私はいくつかの宣言を省略している可能性があります。

+0

QDirIteratorのパフォーマンスヒットに注意してください。 –

関連する問題