6

我不确定为什么我们会使用Directory.GetFilesfor ifDirectory.EnumerateFiles能够做同样的事情,并且您甚至可以在返回找到的整个目录列表之前枚举该列表。

Directory.EnumerateFiles 与 Directory.GetFiles 有什么区别?

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

4

3 回答 3

10

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

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

我想GetFiles可以被认为是一个便利功能。

于 2014-07-04T02:54:26.420 回答
8

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

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

这类似于是否让一切变得 懒惰,或者只是在适当的时候使用它的论点。我认为这有助于正确看待事情,因为无缘无故地让一切变得懒惰是矫枉过正的。

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

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

意图很重要。如果您EnumerateFiles()在一个您知道不会有那么多文件的目录上使用它,那么您只是在不了解的情况下盲目使用它。运行代码的计算机也很重要。如果我在具有 24 GB RAM 的服务器上运行某些东西,那么与GetFiles()在具有 1 GB RAM 的服务器上相比,我可能更有可能使用需要大量内存的方法。

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

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

于 2014-07-04T03:45:13.653 回答
4

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

作为参考,我可以使用 ILSpy ( http://ilspy.net/ )找到它

于 2014-07-04T03:34:47.957 回答