我正在从 .NET 应用程序中搜索适量(~500)个文件夹来查找大量(~200,000)个文件。
我希望使用DirectoryInfo.GetFiles
,传入SearchOption.AllDirectories
。然而,这种方法似乎比编写我自己的代码来迭代目录并仅传入 searchPattern
执行 GetFiles
慢很多。
相关MSDN info :
GetFiles(String)
从当前目录返回与给定 searchPattern 匹配的文件列表。GetFiles(String, SearchOption)
从当前目录返回与给定 searchPattern 匹配的文件列表,并使用一个值来确定是否搜索子目录。
有人有过类似的经历吗?
最佳答案
这两个函数实际上因其性能而臭名昭著。原因是GetFiles
遍历整个目录树并构造一个 FileInfo
的数组对象,然后才将结果返回给调用者。所述数组的构造涉及大量内存分配(我确信他们在内部使用 List
,但仍然如此),因为无法提前知道条目数。
如果您真的对性能感兴趣,您可以 P/Invoke FindFirstFile/FindNextFile/FindClose ,将它们抽象为IEnumerable<FileInfo>
和yield
FileInfo
一次一个。
关于.net - 使用 SearchOption.AllDirectories 时 DirectoryInfo.GetFiles 速度缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1199732/