8

提供されたルートディレクトリから始まるすべてのファイル(読み取りアクセス権がある)への完全修飾パスを簡単にロードする方法はありますstring[]か?

を見ましたSystem.IO.Directory.GetFilesが、入力を許可する前にフィルターを指定する必要があるSearchOption.AllDirectoriesため、試しました:

string[] directoryList = Directory.GetFiles(RootPath, "*.*",
                                            SearchOption.AllDirectories);

RootPath私の有効なルートディレクトリはどこですか。これは問題なく動作するように見えましたが、29 GB の大きなディレクトリ/ファイル構造と数十万のファイルを指定すると、Windows フォーム アプリが非常に長い間ハングアップしました。

そこで、GUI がロックされたように見えないように、を介してスレッド化することを考えましたが、読み込みを行っているのは 1 つのステートメントに過ぎずBackgroundWorker、このようなものの進行状況をどのように報告するかわかりません。ProgressBar事前にファイルの総数、または既に処理された数などに関する情報はありません。

4

1 に答える 1

12

を使用Directory.GetFilesすると、すべての結果が完全に処理されるまで常にブロックされます。これは、大規模なディレクトリ構造では時間がかかる可能性があります。

の代わりにDirectory.EnumerateFilesを使用できますDirectory.GetFiles。これにより、結果が配列ではなく として返されるため、結果のIEnumerable<string>処理 (または進行状況の報告) をすぐに開始できます。

それ以外の場合、最良のオプションは を使用することですが、 は使用Directory.GetFilesしませんSearchOption.AllDirectories。その後、 を使用Directory.GetDirectoriesして自分で再帰を処理し、結果を段階的に解析できます。

于 2012-08-16T20:42:29.217 に答える