2012-08-16 103 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自己处理递归,并分阶段解析结果。