枚举文件系统时删除或移动是否安全?
Is it safe to delete or move while enumerating the file system?
使用 Directory.EnumerateFiles
时删除或移动文件或目录是否安全?
像这样:
foreach (var fileName in Directory.EnumerateFiles("Sub"))
File.Delete(fileName);
我知道,一般来说,您不应该修改您正在枚举的内容。但是,文件系统似乎没有遵循该规则,因为上面的代码有效。
同样的问题适用于 EnumerateDirectories
和 EnumerateFileSystemEntries
,以及 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 命令没那么简单(取决于文件系统),但你明白了。
使用 Directory.EnumerateFiles
时删除或移动文件或目录是否安全?
像这样:
foreach (var fileName in Directory.EnumerateFiles("Sub"))
File.Delete(fileName);
我知道,一般来说,您不应该修改您正在枚举的内容。但是,文件系统似乎没有遵循该规则,因为上面的代码有效。
同样的问题适用于 EnumerateDirectories
和 EnumerateFileSystemEntries
,以及 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 命令没那么简单(取决于文件系统),但你明白了。