更快(最快?)的方法来获取包含超过 200,000 个文件的目录中的文件数

2024-01-12

我有一些包含测试数据的目录,通常每个目录有超过 200,000 个小(~4k)文件。

我使用以下 C# 代码来获取目录中的文件数:

int fileCount = System.IO.Directory.GetFiles(@"C:\SomeDirectory").Length;

然而,这非常非常慢——我可以使用任何替代方案吗?

Edit

每个文件夹包含一天的数据,我们将拥有大约 18 个月的目录(约 550 个目录)。我也对人们通过将平面目录结构重新设计为更嵌套的目录结构而发现的性能增强非常感兴趣。


您得到的代码很慢,因为它首先获取所有可用文件的数组,然后获取该数组的长度。

然而,您几乎肯定不会找到比这更快的解决方案。

Why?

访问控制。

目录中的每个文件may有一个访问控制列表 - 这可能会阻止您查看该文件。

操作系统本身不能只是说“嘿,这里有 100 个文件条目”,因为其中一些可能代表您不允许访问的文件知道存在 - 它们根本不应该展示给你。因此操作系统本身必须迭代文件,逐个文件检查访问权限。

有关此类事情的更详细讨论,请参阅来自旧事新事 https://web.archive.org/web/20100311090157/http://blogs.msdn.com:80/oldnewthing/default.aspx:

  • 为什么文件系统没有一个函数来告诉你目录中的文件数量? https://devblogs.microsoft.com/oldnewthing/20090217-00/?p=19123
  • 为什么资源管理器不将递归目录大小显示为可选列? https://devblogs.microsoft.com/oldnewthing/20071029-00/?p=24663

[顺便说一句,如果您想提高包含大量文件的目录的性能,请严格限制使用 8.3 文件名。不,我不是在开玩笑 - 它更快,因为操作系统本身不必生成 8.3 文件名,而且因为使用的算法是脑死亡的。尝试一个基准测试,你就会看到。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更快(最快?)的方法来获取包含超过 200,000 个文件的目录中的文件数 的相关文章

随机推荐