报告Directory.GetFiles的进度

时间:2012-08-16 20:40:05

标签: c# .net-4.0

是否有一种快速方法可以加载每个文件(您具有读访问权限)的完全限定路径,从提供的根目录开始,例如string[]

我看到System.IO.Directory.GetFiles,但在您被允许输入SearchOption.AllDirectories之前必须提供过滤器,所以我尝试了:

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

RootPath是我有效的有根目录。这似乎工作正常,除了它指向一个29GB的大型目录/文件结构和几十万个文件时,它挂了我的Windows窗体应用程序很长一段时间。

所以我考虑通过BackgroundWorker对其进行线程处理,以便我的GUI看起来没有锁定,但我不确定如何为ProgressBar报告此类内容的进度因为它只是一个正在进行加载的语句,我没有关于前期文件总数的信息,或者它已经处理过的数字等信息。

1 个答案:

答案 0 :(得分:8)

使用Directory.GetFiles,您将始终阻止,直到完成所有结果的处理,这可能需要很长时间才能完成大型目录结构。

您可以使用Directory.EnumerateFiles代替Directory.GetFiles。这会将结果返回为IEnumerable<string>而不是数组,因此您可以立即开始处理(或报告进度)结果。

否则,最好的选择是使用Directory.GetFiles,而不是SearchOption.AllDirectories。然后,您可以使用Directory.GetDirectories自行处理递归,并分阶段解析结果。