c++ - CreateFile 和长设备名

标签 c++ winapi visual-c++ file-io

我正在使用 CreateFile打开设备。一切正常,直到设备名称太长。

在文档中说:

In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see Naming Files, Paths, and Namespaces.

我正在尝试使用 CreateFileW 并将“\\?\”添加到路径中,但得到无效的句柄和

The system cannot find the path specified.

在 GetLastError() 中。

那么,这个技巧是否只对文件名有效,对设备名无效?有没有其他方法可以避免这个问题?

UPD1: 没有前缀的设备名称如下所示:

\\.\devicename\EndsBy:\name1.exe|EndsBy:\name2.exe.

代码:

CreateFileW(path.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0));

最佳答案

\\? 前缀直接将路径发送到文件系统,无需预处理。

\\. 前缀绕过文件命名空间并使用 Win32 设备命名空间。

它们有不同的用途,不能混合在一起。

你可以自己试试。例如,这将打开空设备:

HANDLE hDevice = ::CreateFileW(L"\\\\.\\NUL", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

但是,如果您将路径更改为 L"\\\\?\\\\.\\NUL",它将失败。

要回答您的问题,是的,在路径前加上 \\? 仅对文件系统路径有效。

关于c++ - CreateFile 和长设备名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24295076/

相关文章:

c++ - 链表覆盖之前的值

c++ - 如何获取元组 C++ 的前 N ​​个元素?

c++ - 错误 C2059 : syntax error : '<end Parse>'

c++ - 只有取消按钮的消息框

c++ - VS2010 fatal error LNK1120 : 1 unresolved externals

c++ - 将 C++11 转换为等效的 C++98 代码

c++ - 控制获取制表符和空格等热键

c++ - #define NOMINMAX 使用 std::min/max

C++\Win32 API - WC_BUTTON 和 "BUTTON"窗口类之间的差异

c++ - 我需要使用引用参数来返回值吗?