Directory.EnumerateFiles 与 Directory.GetFiles 有啥区别?

Posted

技术标签:

【中文标题】Directory.EnumerateFiles 与 Directory.GetFiles 有啥区别?【英文标题】:What is the difference between Directory.EnumerateFiles vs Directory.GetFiles?Directory.EnumerateFiles 与 Directory.GetFiles 有什么区别? 【发布时间】:2011-08-05 21:24:15 【问题描述】:

Directory.EnumerateFilesGetFiles 有什么区别?

显然一个返回一个数组,另一个返回 Enumerable。

还有什么?

【问题讨论】:

【参考方案1】:

来自the docs:

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

所以基本上,EnumerateFiles 返回一个 IEnumerable,它可以进行一些延迟评估,而 GetFiles 返回一个 string[],它必须在返回之前完全填充。

【讨论】:

延迟评估可能不会完全免费 - 例如,如果您最终将其放回数组中(我看到了!)。懒惰在“yagni”-all 时是有效的:你不需要所有元素,只需在几个之后停止迭代。 如果您要枚举一个如此大的集合,以至于首先在内存中构建整个集合太重,那么延迟枚举也很有趣。您可以在项目到来时对其进行处理而忘记它们。 @TomaszGandor:或者当不需要存储所有文件名时,例如当只是重命名文件时。 我查看了源代码,发现这两种方法都使用内部FileSystemEnumerableFactory.CreateFileInfoIterator()。但是EnumerateFiles() 直接返回这个迭代器,而GetFiles() 从它构建额外的List 并调用ToArray()。因此,如果您关心速度,使用EnumerateFiles() 并自己处理迭代器是有意义的。 另一个很好的例子是当你实际上不关心任何文件,你只想检查文件夹是否有任何文件或空的。在这种情况下,您可以简单地使用Directory.EnumerateFiles(path).Any(),它将在第一个文件之后立即返回,并且几乎与文件夹为空时一样快。【参考方案2】:

EnumerateFiles 返回IEnumerable<string>,这意味着延迟执行。它仅适用于 .net 4 及更高版本。

由于文件系统的速度非常慢(尤其是对于大型文件夹),延迟执行对于顺序处理来说可能是一个真正的好处。取决于许多其他因素。

【讨论】:

Fx4 是什么意思? .net 框架 4 这是 .NET 4.0 的一个不同寻常的名称【参考方案3】:

使用 EnumerateFiles 时,如果您使用 .Last,所有速度都会丢失。这当然是有道理的,因为要到达最后一个文件,它需要枚举所有文件,然后抓取最后一个。

但是,使用 .First.FirstOrDefault 会变得非常快,因为它只是抓取第一个项目并继续前进。

【讨论】:

这个非常古老的问题询问了除了ArrayEnumerable 方面之外还有什么区别。您的回答对所有此类情况都是通用的,但没有回答所提出的问题。 重点是,在某些情况下,EnumerateFiles 可以让您更快地开始访问数据。 重点是,这作为评论非常有用,但不能回答问题。有区别。

以上是关于Directory.EnumerateFiles 与 Directory.GetFiles 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Directory.EnumerateFiles 显示文件名

X509Certificate2.Verify()行为首次使用

X509Certificate2.Verify() 行为首次使用

搜索名称中包含特定数字的文件

解析多个xml文件时如何检查空xml文件[重复]

如何走目录应用程序 MVC 3? [关闭]