http://code.google.com/p/guava-libraries/issues/detail?id=365讨论递归删除目录时可能发生的潜在竞争条件。
根据http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7148952这可以在 Linux 下使用 openat() 以无竞争的方式实现。 。 Windows下有等效的机制吗?
最佳答案
Windows 文件系统行为和 Linux 文件系统行为之间的一个关键区别是锁定和引用计数。
在 Windows 中,如果进程打开了一个文件,则该文件和通向该文件的路径将受到保护。
因此,如果有人打开了“C:\a\b\c\d\file.txt”,则任何人都不得重命名或删除路径“C:\a\b\c\d”的任何部分\文件.txt”。
Linux 模型有很大不同,该路径的任何部分都可以更改,甚至可以删除文件。持有“file.txt”句柄的进程仍然具有引用,并且在所有句柄关闭之前该文件不会从文件系统中删除。
Win32 API 没有公开保存目录句柄的直接方法(不过,有用于此的 API - 请参阅“Zw”函数、FindFirstFile(可能我不确定)、备份 API 等) - 但您的进程“当前目录”确实持有该目录的句柄。
因此,您可以通过更改工作目录然后直接打开文件来获得“openat”行为。更好的方法是使用 ZwCreateFile() 之类的东西来打开目录的句柄 - 因为“当前目录”是进程全局的。
在 Stackoverflow 和 Microsoft.com 中搜索 ZwCreateFile 信息。
关于winapi - Windows下以无竞争的方式删除目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9764206/