是否有Windows等效的`openat`?

时间:2015-08-21 10:53:15

标签: winapi

标题几乎说,在Windows上,我可以通过使用类似于openat的东西以某种方式在多线程应用程序中模拟多个工作目录吗?

另见this question

1 个答案:

答案 0 :(得分:8)

是的,它被称为NtCreateFile()https://msdn.microsoft.com/en-us/library/bb432380(v=vs.85).aspx):)

openat()将open fd带到路径操作开始的基目录。类似地,您可以向NtCreateFile()的ObjectAttributes.RootDirectory提供一个HANDLE,以使该目录的路径可用作相对路径操作的基础。

如果直接转到NT内核API对你来说太过分了,而你想保留在Win32中,你可以很容易地检索基目录HANDLE的当前路径(参见https://msdn.microsoft.com/en-us/library/windows/desktop/aa366789(v=vs.85).aspx)。如果您打开没有FILE_SHARE_DELETE权限的目录,则任何人都无法重命名,因此只要您将HANDLE保持打开状态,检索到的路径就不会移动。

然后使用正常的字符串连接将检索到的路径与相对路径拼接在一起。

NT内核API方法是Windows上唯一允许基本目录HANDLE由第三方进程任意重命名并且不会导致代码竞争的解决方案。即它是POSIX openat()的唯一等价物。我同意,非常不幸的是Win32没有提供这种功能 - 事实上,Win32没有提供原子重命名,这是一个非常有用的POSIX工具,确实可以让你避免锁定文件,并且NT内核API也提供了一些东西。