我们为什么要使用Directory.GetFiles()而不是Directory.EnumerateFiles() ?

本文关键字:Directory EnumerateFiles GetFiles 为什么 我们 | 更新日期: 2023-09-27 18:11:19

我不知道为什么我们要使用Directory.GetFiles,如果Directory.EnumerateFiles能够做同样的事情,你甚至可以在返回找到的整个目录列表之前枚举列表。

目录和目录的区别是什么?EnumerateFiles vs Directory.GetFiles?

既然EnumerateFiles可用,为什么还需要使用GetFiles呢?

我们为什么要使用Directory.GetFiles()而不是Directory.EnumerateFiles() ?

根据http://msdn.microsoft.com/en-us/library/07wt70x2%28v=vs.110%29.aspx:

EnumerateFiles和GetFiles方法的区别如下使用EnumerateFiles,您可以开始枚举名称集合在整个集合被返回之前;当你使用GetFiles时,你必须等待整个名称数组返回后才能这样做吗访问数组。因此,当您处理许多文件和目录,EnumerateFiles可以更有效。

我想GetFiles可以被认为是一个方便的函数。

您使用正确的工具来完成正确的工作。如果您有少量的文件,那么您可能只想使用Directory.GetFiles()并将它们加载到内存中。

另一方面,

Directory.EnumerateFiles()是当您需要通过一次枚举一个文件来节省内存时。

这类似于是否将所有设置为惰性,还是仅在适当的时候使用它的争论。我认为这有助于正确看待事物,因为毫无理由地让所有东西都变得懒惰是矫枉过正的。

您需要在简单性与效率之间进行权衡。从概念上讲,实际上不包含文件,但每次生成一个文件的枚举数比字符串数组更复杂。能够将枚举数存储在IEnumerable<string>中是一个很棒的抽象,但重点仍然存在。

预测性能也可能更加困难。使用GetFiles(),您知道在调用该方法时产生的性能成本。EnumerateFiles()在被枚举之前不做任何事情。

意图很重要。如果您在一个目录上使用EnumerateFiles(),而您知道这个目录不会有那么多文件,那么您只是盲目地使用它而不了解它。运行代码的计算机也很重要。如果我在一台有24 GB RAM的服务器上运行一些东西,那么我可能更有可能使用像GetFiles()这样的内存消耗方法,而不是在一台有1 GB RAM的服务器上运行。

如果您不知道将有多少文件,或者不确定代码将在哪种环境下运行,那么明智的做法是谨慎行事,使用内存高效的版本。

有很多变量需要考虑,一个好的程序员会考虑这些因素并有目的地做事。

这两个方法最终都会调用System.IO.FileSystemEnumerableFactory.CreateFileNameIterator()。唯一的区别似乎是GetFiles()结果被包装在一个List中,然后转换为一个数组。因此,正如在其他一些答案中提到的,不同之处在于枚举数已经通过GetFiles()遍历,而EnumerateFiles在遍历之前给出了枚举数。

作为参考,我能够找到这个使用ILSpy (http://ilspy.net/)