我正在从.NET应用程序中搜索大量(~200,000)文件的中等数量(~500)文件夹。
我希望使用DirectoryInfo.GetFiles
,传入SearchOption.AllDirectories
。然而,这种方法似乎比编写我自己的代码来遍历目录慢得多,只需传入GetFiles
searchPattern
。
相关MSDN info:
GetFiles(String)
GetFiles(String, SearchOption)
有没有人有类似的经历?
答案 0 :(得分:13)
这两个功能实际上因其性能而臭名昭着。原因是GetFiles
遍历整个目录树并构造一个FileInfo
对象数组,然后才将结果返回给调用者。所述数组的构造涉及大量内存分配(我确信它们在内部使用List
,但仍然)因为无法提前知道条目数。
如果您真的参与演出,可以P / Invoke到FindFirstFile / FindNextFile / FindClose,将它们抽象为IEnumerable<FileInfo>
和yield
FileInfo
一次一个。
答案 1 :(得分:1)
Anton提到的使用FirstFirstFile()
和相关本机方法的方法已经通过DirectoryInfo.EnumerateFiles()
从.NET 4开始实现,因此不再需要P / Invoke!