gpt4 book ai didi

c++ - GetFullPathNameW 和长 Windows 文件路径

转载 作者:可可西里 更新时间:2023-11-01 13:08:17 25 4
gpt4 key购买 nike

在我当前个人项目的 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 一起使用,还是我需要自己处理所有文件路径解析?

最佳答案

  1. GetFullPathNameA 仅限于 MAX_PATH 个字符,因为它事先使用硬编码 将 ANSI 名称转换为 UNICODE 名称>MAX_PATH 大小(以字符为单位)UNICODE 缓冲区。如果转换没有因长度限制而失败,则调用 GetFullPathNameW(或直接 GetFullPathName_U[Ex])并生成 UNICODE名称转换为 ANSI。

  2. GetFullPathNameWGetFullPathName_U 的一个非常薄的外壳。它在 WCHAR 中被限制为 MAXSHORT (0x7fff) 长度,与 \\?\ 文件前缀无关。即使没有 \\?\,它也适用于长 (> MAX_PATH) 相对名称。但是,如果 lpFileName 参数不以 \\?\ 前缀开头,则 lpBuffer 参数中的结果名称将不会以 \\?\ 或者。

  3. 如果您要将 lpBufferCreateFileW 等函数一起使用 - 此函数在内部将 Win32Name 转换为 NtName。结果将取决于颈背类型 (RTL_PATH_TYPE)。如果名称不以 \\?\ 前缀开头,则转换失败,因为 RtlDosPathNameToRelativeNtPathName_U[_WithStatus] 失败(因为如果路径不以 \\?\ 它将在内部调用 GetFullPathName_U(与 GetFullPathNameW 调用的函数相同),其中 nBufferLength 硬编码为 MAX_PATH(恰好 2 *MAX_PATH in bytes – NTDLL 函数使用以字节为单位的缓冲区大小,而不是 WCHARs)。如果名称以 \\?\ 前缀开头,另一种情况是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com