2012-08-16 22 views
5

付属のルートディレクトリから始めて、たとえばstring[]にあるすべてのファイル(読み込みアクセス権を持つ)への完全修飾パスを簡単にロードできますか?Directory.GetFilesの進捗状況

私はSystem.IO.Directory.GetFilesを見ましたが、あなたは、あなたが入力するSearchOption.AllDirectoriesを許可している前にフィルターを供給しなければならないので、私が試した:RootPathは私の有効な、根ざしたディレクトリである

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

を。これは、29GBの大規模なディレクトリ/ファイル構造と数十万個のファイルを指しているときに、非常に長い時間の間、Windowsフォームのアプリケーションを吊り上げることを除いて、正常に動作するように見えました。

私はBackgroundWorkerでスレッドを作成すると思ったので、私のGUIはロックされているようには見えませんでしたが、ProgressBarのようなものの進行状況をどのように報告するのか分かりません読み込み中のファイルの総数や、既に処理したファイルの総数などの情報はありません。

答えて

8

Directory.GetFilesとすると、すべての結果が完全に処理されるまでブロックされます。大規模なディレクトリ構造上の長い時間。

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

それ以外の場合は、Directory.GetFilesを使用することをお勧めしますが、SearchOption.AllDirectoriesは使用しないことをお勧めします。 Directory.GetDirectoriesを使用して、自分で再帰を処理し、結果を段階的に解析することができます。

関連する問題