在Directory.GetFiles中报告进度

8

有没有一种快速的方法,可以将从提供的根目录开始,您拥有读取权限的每个文件的完全限定路径加载到string[]中?

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

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

RootPath是我有效的、根目录。这个方法似乎可以正常使用,但当它指向一个29GB大小的大型目录/文件结构和数十万个文件时,它会让我的Windows表单应用程序卡在那里很长时间。

因此,我考虑通过BackgroundWorker把它放入线程中,这样我的GUI不会出现死锁,但我不确定如何为像这样一个ProgressBar报告进度,因为它只执行一条语句并且我没有关于预处理的总文件数或已处理文件数的信息等。

1个回答

13

使用Directory.GetFiles会一直阻塞,直到所有结果都完全处理完毕,对于大型目录结构可能需要很长时间。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接