使用 Directory.EnumerateFiles
时删除或移动文件或目录是否安全?
像这样:
foreach (var fileName in Directory.EnumerateFiles("Sub"))
File.Delete(fileName);
我知道,一般来说,你不应该修改你枚举的内容。但是,文件系统似乎没有遵循该规则,因为上面的代码有效。
同样的问题也适用于EnumerateDirectories
和EnumerateFileSystemEntries
,以及DirectoryInfo
类的等价方法。
是的,您可以在此类枚举期间安全地删除当前文件(至少在 Windows 上(。 Directory.EnumerateFiles
通过 FindFirstFile 和 FindNextFile winapi 调用在内部(在 Windows 上(实现。所以首先调用FindFirstFile
,并在每个迭代器前进(MoveNext()
(上调用FindNextFile
。如果在这些调用之间删除了文件 - 对于该 API 来说不是问题,FindNextFile
只会返回下一个匹配的文件。在您的情况下,您删除当前文件,以便根本不跳过任何内容。如果在枚举过程中添加了新文件 - 这取决于它的名称是否被包含。假设您已经获得了文件"b.txt"和"c.txt",然后添加了文件"a.txt"。这样的文件不会使用 Directory.EnumerateFiles
包含在内,因为它的名称是"更少"(在某种意义上(文件已经枚举。退货单不是那么简单(取决于文件系统(,但你明白了。