2012-08-16 74 views
5

是否有一種快速方法可以將從提供的根目錄開始的每個文件(您有權讀取的文件)的完全限定路徑加載到一個string[]Directory.GetFiles上的報告進度

我看到System.IO.Directory.GetFiles,但你有你被允許輸入SearchOption.AllDirectories之前提供一個過濾器,所以我嘗試:

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

哪裏RootPath是我有效的,根深蒂固的目錄。這似乎工作正常,除了它將我的Windows窗體應用程序掛起很長一段時間時,它指向一個29GB大小的目錄/文件結構和幾十萬個文件。

所以我想通過BackgroundWorker對它進行線程化處理,以便我的GUI沒有出現鎖定,但我不知道如何報告ProgressBar這樣的事情的進度,因爲它只是一個聲明加載和我沒有任何信息的前期文件總數,或它已經處理的數量等

回答

8

隨着Directory.GetFiles,你將永遠阻止,直到所有的結果都完成處理,這可能需要一個長時間在一個大的目錄結構上。您可以使用Directory.EnumerateFiles而不是Directory.GetFiles。這將返回結果作爲IEnumerable<string>而不是數組,因此您可以立即開始處理(或報告進度)結果。

否則,最好的選擇是使用Directory.GetFiles,但不是SearchOption.AllDirectories。然後您可以使用Directory.GetDirectories自己處理遞歸,並分階段解析結果。