使用SearchOption.AllDirectories时,DirectoryInfo.GetFiles会变慢

时间:2009-07-29 11:55:43

标签: .net performance file-io

我正在从.NET应用程序中搜索大量(~200,000)文件的中等数量(~500)文件夹。

我希望使用DirectoryInfo.GetFiles,传入SearchOption.AllDirectories。然而,这种方法似乎比编写我自己的代码来遍历目录慢得多,只需传入GetFiles searchPattern

相关MSDN info

  • GetFiles(String)
    从与给定searchPattern匹配的当前目录返回文件列表。
  • GetFiles(String, SearchOption)
    从与给定searchPattern匹配的当前目录返回文件列表,并使用值确定是否搜索子目录。

有没有人有类似的经历?

2 个答案:

答案 0 :(得分:13)

这两个功能实际上因其性能而臭名昭着。原因是GetFiles遍历整个目录树并构造一个FileInfo对象数组,然后才将结果返回给调用者。所述数组的构造涉及大量内存分配(我确信它们在内部使用List,但仍然)因为无法提前知道条目数。

如果您真的参与演出,可以P / Invoke到FindFirstFile / FindNextFile / FindClose,将它们抽象为IEnumerable<FileInfo>yield FileInfo一次一个。

答案 1 :(得分:1)

Anton提到的使用FirstFirstFile()和相关本机方法的方法已经通过DirectoryInfo.EnumerateFiles()从.NET 4开始实现,因此不再需要P / Invoke!