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

179
Directory.EnumerateFilesGetFiles 有什么区别?
显然,一个返回数组,另一个返回 Enumerable。
还有其他的区别吗?
3个回答

206

官方文档中得知:

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

所以基本上,EnumerateFiles 返回一个可延迟评估的 IEnumerable,而 GetFiles 返回一个必须完全填充后才能返回的 string[]


7
懒惰求值可能并非完全免费——例如,如果最终将其放回数组中(我看到过这种情况!)。当您不需要所有元素并且只需在几个之后停止迭代时,“YAGNI”原则使得懒惰求值变得更加有效率。 - Tomasz Gandor
11
如果要枚举一个非常大的集合,先在内存中构建整个集合会太耗费资源,这时候惰性枚举非常有用。你只需逐个处理项并在处理后立即遗忘它们。 - Stéphane Gourichon
1
@TomaszGandor:或者当没有必要存储所有文件名时,例如仅重命名文件时。 - Sebastian Mach
2
我查看了源代码,发现两种方法都使用了内部的 FileSystemEnumerableFactory.CreateFileInfoIterator()。但是 EnumerateFiles() 直接返回此迭代器,而 GetFiles() 则从中构建额外的 List 并调用 ToArray()。因此,如果您关心速度,最好使用 EnumerateFiles() 并自己处理迭代器。 - dmitry1100
4
另一个很好的例子是当你实际上不关心任何文件,只想检查文件夹是否有文件或为空时。在这种情况下,您可以简单地使用 Directory.EnumerateFiles(path).Any(),它会在第一个文件后立即返回,并且几乎与文件夹为空时一样快。 - Racil Hilan

38
EnumerateFiles 返回 IEnumerable<string>,这意味着它具有延迟执行的特性。它仅在 .net 4 及以上版本中可用。
由于文件系统通常较慢(尤其是对于大型文件夹),延迟执行对于顺序处理来说是一个真正的优势。这取决于许多其他因素。

5
Fx4的意思是什么? - Minh Nguyen
4
.NET Framework 4是一个由微软开发的应用程序框架,它提供了大量的编程库和运行环境,可用于开发和运行Windows操作系统上的各种类型的应用程序。它包括许多功能强大的组件,例如ASP.NET、ADO.NET和Windows Presentation Foundation(WPF),并且可以与各种编程语言一起使用,包括C#、Visual Basic和F#等。该框架还支持多个平台,包括桌面、Web和移动设备。 - H H
25
这是.NET 4.0一个不寻常的名称。 - Snak
没有叫做".net 4"的东西。回到2011年,只有.NET Framework,所以那时并不会引起困惑。但是现在有一个叫做".NET"的东西,所以现在就不太清楚了。 - undefined

20
使用 EnumerateFiles 时,如果随后使用 .Last,则会失去所有速度。 这当然是有道理的,因为要获取最后一个文件,它需要枚举所有文件,然后获取最后一个文件。
然而,使用 .First 或 .FirstOrDefault 就变得非常快,因为它只需获取第一个项目并继续执行。

6
除了 ArrayEnumerable 方面之外,这个非常古老的问题询问了有哪些差异。你的回答适用于所有类似的情况,但并没有回答所问的问题。 - Ashigore
2
问题是,EnumerateFiles可以让你在某些情况下更快地开始访问数据。 - Skotte
19
重点是,这段话作为评论非常有用,但它并没有回答问题。这是有区别的。 - djv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接