winapi - Windows下以无竞争的方式删除目录?

标签 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下有等效的机制吗?

最佳答案

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/

相关文章:

c++ - 通过代码在 Windows 操作系统上启用和禁用 DST

c# - 为什么 File.WriteAllText() 通过添加逗号来格式化我的数字?

c++ - 跨各种线程的unique_lock

C# 多线程和重新排序 - 这里发生了什么?

c++ - OpenMP 还原同步错误

winapi - 如何将 "wide"字符串读入缓冲区?

c++ - 如何使用visual c++在win32 API中添加图片框

c++ - HeapAlloc 返回 0xC0000017 : Not Enough Quota

c - 如何将文件行中的字符保存到字符数组中?

c# - 如何选择用户删除文件夹中的所有文件(但不包括子目录)?