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



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

像这样:

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

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

同样的问题也适用于EnumerateDirectoriesEnumerateFileSystemEntries,以及DirectoryInfo类的等价方法。

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

最新更新