在Windows下以无种族方式删除目录?

时间:2012-03-19 02:18:54

标签: winapi file-io race-condition

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下是否有等效的机制?

1 个答案:

答案 0 :(得分:0)

Windows文件系统行为与linux文件系统行为之间的主要区别在于锁定和引用计数。

在Windows中,如果某个进程打开了一个文件,那么该文件将导致该文件的路径受到保护。

因此,如果有人打开“C:\ a \ b \ c \ d \ file.txt”,则不允许任何人重命名或删除路径的任何部分“C:\ a \ b \ c \ d \ file.txt的”。

linux模型有很大不同,可以更改该路径的任何部分,甚至可以删除该文件。持有“file.txt”句柄的进程仍然有一个引用,并且在关闭所有句柄之前,不会从文件系统中删除该文件。

Win32 API没有公开保存目录句柄的直接方法(但是,有这方面的API - 请参阅“Zw”函数,FindFirstFile可能我不确定,备份API等) - 但您的进程“当前目录”确实包含该目录的句柄。

因此,您可以通过更改工作目录然后直接打开文件来获得“openat”行为。更好的方法是使用类似ZwCreateFile()的东西来打开目录的句柄 - 因为“当前目录”是进程全局的。

在Stackoverflow和Microsoft.com上搜索ZwCreateFile信息。