【问题标题】:Using Directory.EnumerateFiles()使用 Directory.EnumerateFiles()
【发布时间】:2021-08-11 22:21:33
【问题描述】:

我正在使用 Directory.EnumerateFiles() 遍历代码中的特定目录。我只需要目录中存在的每个文件的文件名,但文件数量可能很大。根据 MSDN 和其他各种来源,我们看到它提到“当您使用 EnumerateFiles 时,您可以在返回整个集合之前开始枚举名称集合。当您使用 GetFiles 时,您必须等待整个数组在访问数组之前要返回的名称。", here

所以,我在我的机器上做了一些实验。

var files = Directory.EnumerateFiles(path);
foreach(var file in files)
{
}

在开始迭代之前我有一个调试器,即在 foreach 中。我看到files(返回的可枚举字符串)包含我目录中的所有条目。为什么这个?这是预期的吗?

在其他一些来源上,我看到我们需要有一个单独的任务来执行迭代,同时在另一个处理线程中,可以迭代枚举,example。我一直在寻找类似的东西:默认情况下,枚举器会获取前 200 个文件。对 MoveNext() 的连续调用,即当访问第 201 个项目时,将获取下一批文件。

【问题讨论】:

    标签: c# .net directory getfiles


    【解决方案1】:

    这里的变量files 是一个IEnumerable,懒惰地评估。如果您将鼠标悬停在调试器中的files 上并单击“结果视图”,则将进行完整的评估(就像您调用了ToArray() 一样)。否则,只会在您需要时获取文件(即,foreach 循环一次获取一个文件)。

    所以当你说:

    “我看到文件(返回的可枚举字符串)包含我目录中的所有条目”

    我认为你错了。

    【讨论】:

    • 哦,所以在调试器中单击结果视图将触发完整评估。知道了。这说明了。谢谢!
    • 另外,这种惰性求值在内部是如何工作的?它会先获取一些 n 个文件,然后再获取另外 n 个文件,依此类推吗?
    • @user3004790 (1) 在调试器中展开结果之前,它甚至在值“展开结果视图将枚举 IEnumerable”中显示以下内容 (2) 这是特定于实现的,所以如果文档没有'没有具体定义它,它可以是实现决定的任何东西。
    猜你喜欢
    • 2011-07-03
    • 2020-06-18
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多