枚举文件系统时删除或移动是否安全?

Is it safe to delete or move while enumerating the file system?

使用 Directory.EnumerateFiles 时删除或移动文件或目录是否安全?

像这样:

foreach (var fileName in Directory.EnumerateFiles("Sub"))
    File.Delete(fileName);

我知道,一般来说,您不应该修改您正在枚举的内容。但是,文件系统似乎没有遵循该规则,因为上面的代码有效。

同样的问题适用于 EnumerateDirectoriesEnumerateFileSystemEntries,以及 DirectoryInfo class.

的等效方法

是的,您可以在此类枚举期间安全地删除当前文件(至少在 windows 上)。 Directory.EnumerateFiles 通过 FindFirstFile and FindNextFile winapi 调用在内部实现(在 windows 上)。所以首先调用 FindFirstFile 并在每个迭代器上调用 advance (MoveNext()) - FindNextFile 。如果在这些调用之间删除了文件 - api 不是问题,FindNextFile 将只是 return 下一个匹配文件。在您的情况下,您删除当前文件,这样就不会跳过任何内容。如果在枚举过程中添加了新文件 - 是否包含它取决于它的名称。假设您已经获得文件 "b.txt" 和 "c.txt",然后添加了文件 "a.txt"。使用 Directory.EnumerateFiles 不会包含此类文件,因为它的名称是 "less"(在某种意义上)文件已经枚举。 Return 命令没那么简单(取决于文件系统),但你明白了。