すべての* .jpgファイルなど、特定の拡張子を持つファイルに対してディレクトリとすべてのサブディレクトリを再帰的にスキャンします。 Qtでどうすればいいですか?Qt内のディレクトリとそのサブディレクトリ内のすべてのファイルを反復して繰り返します。
答えて
私はあなたがQDirIteratorを見てみることをお勧めします。
QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
qDebug() << it.next();
これによりアルゴリズムのスケーラビリティが向上します。 QDir::entryList()
は、多くのファイルが1つのディレクトリに格納されているときに突然大きなメモリ容量を消費することがあります。小型の組み込み機器ではうまくいかない
公式ドキュメントを正しく読んでいないため、時間が無駄になりました。 "next()関数は次のディレクトリエントリへのパスを返し、イテレータを進めます。"ですから、ファイルを取り扱うコードは 'it.next()'の後に来るべきです。 –
これは動作するはずです:あなたのコードから
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。ファイルの名前だけが必要な場合は必要ありません。
私はそれをテストし、それが正常に動作しますが、次のように注意してください:
- これは多くの時間がかかるので、あなたが持つかもしれない深い再帰がある場合は、スレッド
- からそれを実行することを検討しますあなたのスタックの問題
何かが見つからない限り、彼の機能の出力を変更しました。彼は指定されたディレクトリ内のすべてのファイルのリストを望んでいますが、関数はファイル名だけを出力しますが、リストは出力しません。 –
彼は 'nutFiles'文字列リストを埋めていないので、私はこの部分を含めませんでした。関数を修正してすべてのファイルのリストを取得するのはかなり簡単ですが、 – pnezis
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());
}
}
感謝。
編集:私はいくつかの宣言を省略している可能性があります。
QDirIteratorのパフォーマンスヒットに注意してください。 –
- 1. Python:ディレクトリ内のすべてのファイルを繰り返します。
- 2. ディレクトリとそのサブディレクトリ内のすべてのファイルを印刷
- 3. Unix。ディレクトリ内のすべてのファイルとそのサブディレクトリのチェックサム
- 4. ディレクトリとそのすべてのサブディレクトリ内の高速一覧ファイル
- 5. zipファイル内のすべてのディレクトリを繰り返します。java
- 6. ディレクトリとサブディレクトリのすべての.jpgファイルまたは.jpegファイルを繰り返します。
- 7. ディレクトリとすべてのサブディレクトリ内のすべてのXMLファイルを解析する
- 8. ディレクトリ内のすべてのファイルを繰り返し、テキストを検索して置き換えます - Python
- 9. ディレクトリ内のファイルを反復してコンテンツを検索する
- 10. クラス内でargparseを使用して反復を繰り返しますか?
- 11. ディレクトリ内のHTMLファイルを反復して使用する - python
- 12. forループ内のサブディレクトリを繰り返します。R
- 13. がディレクトリにサブディレクトリとそのサブディレクトリ内のファイル
- 14. ディレクトリ内とサブディレクトリ内のすべてのtxtファイルに書き込む
- 15. BOOST_FOREACHを使用してディレクトリ内のすべてのファイルを反復処理します
- 16. Bash:サブディレクトリではないディレクトリ内のすべてのファイル
- 17. ディレクトリとすべてのサブディレクトリ内の特定のファイルを削除する
- 18. シェルはディレクトリを繰り返し処理し、そのすべてのファイルを移動します
- 19. ディレクトリ内のすべてのサブディレクトリからのリンクとしてPHPでファイルを一覧表示する(ファイルのみ)
- 20. シェルスクリプト内のすべての文字と数字を繰り返します。
- 21. ルビーのすべてのファイルの内容を反復して印刷する
- 22. ディレクトリ内のすべてのフォルダとファイル
- 23. ディレクトリ内のすべてのサブディレクトリとファイルを一覧表示する
- 24. Python 2.7 Script - ディレクトリとサブディレクトリ内のすべてのファイルの文字列を検索
- 25. bash内のすべてのサブディレクトリ内のすべてのファイルのリストを作成
- 26. .bat経由でディレクトリ内の特定のファイルを繰り返します。
- 27. MATLABを使用してディレクトリ内のファイル名のみを反復する
- 28. PHPの特定ディレクトリ内のすべてのサブディレクトリを削除しますか?
- 29. @内の名前を繰り返して
- 30. Pythonは、作業ディレクトリ内のそのファイルタイプのすべてのファイルに対して、ファイル内の内容を使用してファイルの名前を変更します。
QtにはQFileSystemModelオブジェクトが含まれています。 – Chris