- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我当前个人项目的 Windows 版本中,我希望支持 extended length filepaths .因此,我对如何使用 GetFullPathNameW 有点困惑。用于解析长文件路径全名的 API。
根据 MSDN(关于 lpFileName 参数):
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 a File.
如果我理解正确,为了使用带有 GetFullPathNameW
的扩展长度文件路径,我需要指定一个带有 \\?\
前缀的路径.由于 \\?\
前缀仅在卷号或 UNC 路径之前有效,这意味着 API 无法用于解析相对于当前目录的路径的全名。
如果是这样的话,如果结果名称的长度超过 MAX_PATH
?如果没有,我是否可以将 GetCurrentDirectory
与相对文件路径 (\\?\C:\my\cwd\..\somedir\somefile.txt
) 结合起来将它与 GetFullPathNameW
一起使用,还是我需要自己处理所有文件路径解析?
最佳答案
GetFullPathNameA
仅限于 MAX_PATH
个字符,因为它事先使用硬编码 将 ANSI 名称转换为
大小(以字符为单位)UNICODE
名称>MAX_PATHUNICODE
缓冲区。如果转换没有因长度限制而失败,则调用 GetFullPathNameW
(或直接 GetFullPathName_U[Ex]
)并生成 UNICODE
名称转换为 ANSI。
GetFullPathNameW
是 GetFullPathName_U
的一个非常薄的外壳。它在 WCHAR 中被限制为 MAXSHORT (0x7fff)
长度,与 \\?\
文件前缀无关。即使没有 \\?\
,它也适用于长 (> MAX_PATH
) 相对名称。但是,如果 lpFileName
参数不以 \\?\
前缀开头,则 lpBuffer
参数中的结果名称将不会以 \\?\
或者。
如果您要将 lpBuffer
与 CreateFileW
等函数一起使用 - 此函数在内部将 Win32Name
转换为 NtName
。结果将取决于颈背类型 (RTL_PATH_TYPE
)。如果名称不以 \\?\
前缀开头,则转换失败,因为 RtlDosPathNameToRelativeNtPathName_U[_WithStatus]
失败(因为如果路径不以 \\?\
它将在内部调用 GetFullPathName_U
(与 GetFullPathNameW
调用的函数相同),其中 nBufferLength
硬编码为 MAX_PATH(恰好 2 *MAX_PATH
in bytes – NTDLL 函数使用以字节为单位的缓冲区大小,而不是 WCHAR
s)。如果名称以 \\?\
前缀开头,另一种情况是RtlDosPathNameToRelativeNtPathName_U[_WithStatus]
被执行 – RtlpWin32NtNameToNtPathName
,它用 \??\
替换了 \\?\
并具有没有 MAX_PATH
限制
所以解决方案可能是这样的:
if(ULONG len = GetFullPathNameW(FileName, 0, 0, 0))
{
PWSTR buf = (PWSTR)_alloca((4 + len) * sizeof(WCHAR));
buf[0] = L'\\', buf[1] = L'\\', buf[2] = L'?', buf[3] = L'\\';
if (len - 1 == GetFullPathName(FileName, len, buf + 4, &c))
{
CreateFile(buf, ...);
}
}
因此我们需要指定一个带有 \\?\
前缀的路径,但不是在 GetFullPathName 之前 - 之后!
有关更多信息,请阅读此 - The Definitive Guide on Win32 to NT Path Conversion
关于c++ - GetFullPathNameW 和长 Windows 文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38036943/
在我当前个人项目的 Windows 版本中,我希望支持 extended length filepaths .因此,我对如何使用 GetFullPathNameW 有点困惑。用于解析长文件路径全名的
我是一名优秀的程序员,十分优秀!