标题几乎说明了,在 Windows 上,我可以使用类似于 openat
的东西以某种方式模拟多线程应用程序中的多个工作目录吗? ?
另见 this question .
最佳答案
是的,它被称为 NtCreateFile()
( https://msdn.microsoft.com/en-us/library/bb432380(v=vs.85).aspx ) :)openat()
将打开的 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 提供的东西。
关于winapi - 是否有相当于 `openat` 的 Windows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32138524/