c# - 如果目录内容在迭代过程中发生变化,Directory.EnumerateFiles 会发生什么?

标签 c# file enumerate getfiles system.io.directory

我已经阅读了关于 Directory.EnumerateFiles 之间差异的讨论和 Directory.GetFiles .

我知道他们在内部都使用System.IO.FileSystemEnumerableFactory.CreateFileNameIterator()
不同的是EnumerateFiles可能会使用延迟执行(懒惰),而 GetFiles()ToArray ,所以函数已经执行了。

但是如果在迭代过程中将文件和文件夹添加到字典中会发生什么。迭代是否仅迭代 EnumerateFiles() 期间存在的项目? ?

更糟糕的是:如果在迭代过程中删除文件会发生什么:它们还会被迭代吗?

最佳答案

感谢 Michal Komorowski。然而,当我自己尝试他的解决方案时,我发现 Directory.EnumerateFiles 和 Directory.GetFiles() 之间存在显着区别:

Directory.CreateDirectory(@"c:\MyTest");
// Create fies: b c e
File.CreateText(@"c:\MyTest\b.txt").Dispose();
File.CreateText(@"c:\MyTest\c.txt").Dispose();
File.CreateText(@"c:\MyTest\e.txt").Dispose();

string[] files = Directory.GetFiles(@"c:\MyTest");
var fileEnumerator = Directory.EnumerateFiles(@"c:\MyTest");

// delete file c; create file a d f
File.Delete(@"c:\MyTest\c.txt");
File.CreateText(@"c:\MyTest\a.txt").Dispose();
File.CreateText(@"c:\MyTest\d.txt").Dispose();
File.CreateText(@"c:\MyTest\f.txt").Dispose();

Console.WriteLine("Result from Directory.GetFiles");
foreach (var file in files) Console.WriteLine(file);
Console.WriteLine("Result from Directory.EnumerateFiles");
foreach (var file in fileEnumerator) Console.WriteLine(file);

这将给出不同的输出。
Result from Directory.GetFiles
c:\MyTest\b.txt
c:\MyTest\c.txt
c:\MyTest\e.txt
Result from Directory.EnumerateFiles
c:\MyTest\b.txt
c:\MyTest\d.txt
c:\MyTest\e.txt
c:\MyTest\f.txt

结果:
  • GetFiles 仍然看到旧文件:B C E 正如所料
  • EnumerateFiles 看到了新文件 D 和 F。它正确地跳过了删除的文件 C,但它错过了新文件 A。

  • 所以 EnumerateFiles 和 GetFiles 之间的用法差异不仅仅是性能。
  • GetFiles 返回调用函数时文件夹中的文件。这是可以预料的,因为它只是一个字符串集合的枚举
  • EnumerateFiles 正确跳过已删除的文件,但没有看到所有添加的文件。如果在枚举结果时文件夹发生变化,则结果相当不确定。

  • 因此,如果您希望您的文件夹在枚举时发生更改,请仔细选择所需的函数
  • 期望 GetFiles 查看已删除的文件
  • 预计 EnumerateFiles 会错过一些新文件。
  • 关于c# - 如果目录内容在迭代过程中发生变化,Directory.EnumerateFiles 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555761/

    相关文章:

    c# - 如何在具有可变字段的 .NET 应用程序中包含 HTML 文档?

    c# - Linq-to-entities 中的 OrderBy、Select 和 Where 子句的顺序是否重要

    python - 递归枚举 JSON 层次结构父/子到字典

    python - 使用Python从txt文件中删除副文本(或 'noise')

    Python仅枚举反向索引

    c# - C# 函数是否有标准的 "never returns"属性?

    c# - HTTP 和 HTTP WCF 服务

    iphone - NSFileManager 在应用程序委托(delegate)中崩溃

    java - 为什么我的文件写入方法不起作用?

    python - 在Python中连接来自connection.recv()的数据包