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

时间:2017-04-07 14:04:36

标签: c# .net filesystems

使用Directory.EnumerateFiles

时删除或移动文件或目录是否安全?

这样的事情:

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

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

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

1 个答案:

答案 0 :(得分:1)

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