是否有Windows等效的`openat`?

hei*_*991 3 winapi

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

另见这个问题.

Nia*_*las 8

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

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

如果直接转到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提供的东西.