gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:53:51 27 4
gpt4 key购买 nike

我已经阅读了关于 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com