创建文件和长设备名称
CreateFile and long device name
我使用CreateFile打开设备。一切正常,直到设备名称太长。
在文档中说:
在该函数的ANSI版本中,名称被限制为MAX_PATH字符。要将此限制扩展到32,767个宽字符,请调用该函数的Unicode版本并在前面加上"\? "到小路上。有关详细信息,请参见命名文件、路径和命名空间。
我试图使用CreateFileW和前置"\?"到路径,但得到无效句柄和
系统找不到指定的路径。
在每个盘().
那么,这个技巧只对文件名有效,对设备名无效吗?还有其他方法可以避免这个问题吗?
UPD1: 不带前缀的设备名看起来像:
代码:设备名称 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设备命名空间。
它们有各自的用途,不能混合在一起。
你可以自己试试。例如,这将打开null设备:
HANDLE hDevice = ::CreateFileW(L"\\.\NUL", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
但是如果您将路径更改为L"\\?\\.\NUL"
,则会失败。
回答你的问题,是的,用\?
前缀路径只对文件系统路径有效。
尝试一下:
-
通常可以将
\.
替换为\?
;这是我的理解,这并不总是有效的,但我不知道规则是什么。 -
如果你在Windows 8上尝试使用
CreateFile2
和\.
格式;文档中没有提到路径长度限制。 -
尝试联系设备驱动程序的供应商,他们应该已经意识到这将是一个问题,并希望有一个解决方案。
-
尝试使用
DefineDosDevice
为您的长路径创建别名,并使用CreateFile
打开\.myalias
。我不确定您要混叠的路径的正确语法,但您可以使用QueryDosDevice
查看现有的别名以获得指导。我相信你会想使用DDD_RAW_TARGET_PATH
标志。 -
如果这些都失败了,你可能需要求助于
NtCreateFile
。您应该能够使用CreateFile
打开\.devicename
,然后使用该句柄作为对NtCreateFile
调用的根目录。这里的缺点是API不能保证在未来版本的Windows中保持兼容。
- 如何按文件扩展名引用文件夹中的文件
- 在安卓设备上找不到使用 QStandardPath 创建的文件
- 生成文件:动态源文件名和对象目录
- 为什么我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?
- 使用Boost文件系统C++将具有特定扩展名的文件的名称保存在特定文件夹中
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何从命令行使用 cmake 为有根的安卓设备制作可执行文件?
- CMake 不编译具有非标准扩展名的文件
- Visual Studio 2019 - 设置文件类型的默认扩展名
- 如何在 Windows 上获取带有 c++ 且没有 <dirent.h> 的特定扩展名的所有文件的列表
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 如何在 vscode 扩展名中检索 C/C++ 文件的编译命令
- 通过cMake使用具有自定义文件扩展名的共享库
- 如何在 CMake 中"override"文件的按扩展名类型
- 在另一个字符串中插入文件扩展名之前的字符串
- 下面的C++代码将如何作为java类文件(名为Monstor)编写
- 使用 .ipp 扩展名和.cpp扩展名文件的区别
- 比较两个位图(设备上下文 - 文件)
- 是否有适用于Windows的iTunes C++库允许访问USB连接的iOS设备的文件系统?
- 如何使用Visual c++从USB大容量存储设备读取文件