我们有没有理由在Directory.EnumerateFiles()上使用Directory.GetFiles()?

时间:2014-07-04 02:49:49

标签: c#

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

What is the difference between Directory.EnumerateFiles vs Directory.GetFiles?

为什么,现在EnumerateFiles可用,是否需要使用GetFiles

3 个答案:

答案 0 :(得分:10)

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

  

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

我猜GetFiles可以被认为是一种便利功能。

答案 1 :(得分:7)

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

另一方面,

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

这类似于是否要所有 lazy,或者只是在适当的时候使用它。我认为这有助于把事情放在眼里,因为没有充分理由让一切都变得过于懒散。

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

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

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

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

需要考虑许多变量,优秀的程序员会考虑这些因素,并有目的地做事。

答案 2 :(得分:4)

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

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

找到它