winapi - 是否有相当于 `openat` 的 Windows?

标签 winapi

标题几乎说明了,在 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/

相关文章:

winapi - 在 Win32 中打印

c++ - 具有两个线程的 STL 队列(生产者、消费者)

c# - 将 System.Windows.Rect 转换为 System.Windows.Point

使用 winegcc 编译 Visual C++ 6 项目

c - Windows 中的 ReadFile()

c++ - VS2010 中的 Windows 窗体应用程序无需 .NET?

c - 如何通过pdf阅读器找出pdf文件是否为 "blocked"

c++ - Windows api 中是否有 O(1) 方式来连接 2 个文件?

c++ - 有什么方法可以在运行时不间断地动态更新二进制文件(可执行文件)?

c# - 了解 AttachThreadInput - 分离失去焦点