我已经阅读了关于 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
结果:
所以 EnumerateFiles 和 GetFiles 之间的用法差异不仅仅是性能。
因此,如果您希望您的文件夹在枚举时发生更改,请仔细选择所需的函数
关于c# - 如果目录内容在迭代过程中发生变化,Directory.EnumerateFiles 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555761/