.net - 使用 SearchOption.AllDirectories 时 DirectoryInfo.GetFiles 速度缓慢

标签 .net performance file-io

我正在从 .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/

相关文章:

sql - 棘手的 MS Access SQL 查询以删除多余的重复记录

javascript - REACT- 将需要经常更新的数据存储为全局变量而不是使用 setState() - 不推荐?

c++ - 从/到文本文件每行读/写变量行? (C++)

.net - 将 app.config 与类库一起使用

c# - 如何在C#中重新加载U盘?

c# - XmlWriter 写入空 xmlns

c++ - std::map::find 的效率与值的数据大小有关吗?

c# - 如何定义没有固定大小的数组?

c# - 删除文件前几个字节的最快方法

r - 将数组从 matlab 导入 R