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.EnumerateFiles
与 GetFiles
有什么区别?
显然一个返回一个数组,另一个返回 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
会变得非常快,因为它只是抓取第一个项目并继续前进。
【讨论】:
这个非常古老的问题询问了除了Array
与Enumerable
方面之外还有什么区别。您的回答对所有此类情况都是通用的,但没有回答所提出的问题。
重点是,在某些情况下,EnumerateFiles 可以让您更快地开始访问数据。
重点是,这作为评论非常有用,但不能回答问题。有区别。以上是关于Directory.EnumerateFiles 与 Directory.GetFiles 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Directory.EnumerateFiles 显示文件名
X509Certificate2.Verify()行为首次使用