【发布时间】:2016-06-26 09:14:42
【问题描述】:
在我当前个人项目的 Windows 版本中,我希望支持 extended length filepaths。结果,我有点困惑如何使用GetFullPathNameW API 来解析长文件路径的全名。
根据 MSDN(关于 lpFileName 参数):
在此函数的 ANSI 版本中,名称仅限于 MAX_PATH 个字符。要将此限制扩展到 32,767 个宽字符,请调用函数的 Unicode 版本并在路径前添加“\?\”。有关详细信息,请参阅命名文件。
如果我理解正确,为了使用带有GetFullPathNameW 的扩展长度文件路径,我需要指定一个带有\\?\ 前缀的路径。由于 \\?\ 前缀仅在卷字母或 UNC 路径之前有效,这意味着 API 无法用于解析相对于当前目录的路径的全名。
如果是这种情况,如果结果名称的长度超过 MAX_PATH,我是否可以使用另一个 API 来解析文件路径的全名,例如 ..\somedir\somefile.txt?如果没有,我是否可以将 GetCurrentDirectory 与相对文件路径 (\\?\C:\my\cwd\..\somedir\somefile.txt) 结合使用并将其与 GetFullPathNameW 一起使用,还是我需要自己处理所有文件路径解析?
【问题讨论】:
-
查找完整路径的函数要求您提供完整路径听起来不合理。那么为什么不试试文档所说的。也许你会感到惊喜。
-
GetCurrentDirectory() 是一个从根本上受 MAX_PATH 阻碍的unixism。本机操作系统没有相对路径或默认目录的概念,您必须始终为其提供完整路径名。你必须摆脱它才能取得成功。
-
@Cheersandhth.-Alf 不太清楚你是否建议我尝试
\\?\C:\my\cwd\..\somedir\somefile.txt或\\?\..\somedir\somefile.txt,所以我都尝试了。第一个正确解析为\\?\C:\my\somedir\somefile.txt,(它回答了我的部分问题),而第二个错误解析为\\?\somedir\somefile.txt。 -
@HansPassant 我很清楚:我们说的是
GetCurrentDirectory,而不是_getcwd,对吧?假设是这种情况,您是说GetCurrentDirectory不适用于长 cwd 路径,即使我使用GetCurrentDirectoyW和来自使用CreateProcess的lpCurrentDirectory参数创建的进程的足够大小的缓冲区使用\\?\前缀?如果是这样,那真是令人讨厌的限制。 -
GetFullPathName完全基于字符串;它只是对你给它的内容进行字符串操作+无论当前目录是什么。关于 \\?\ 的段落只是样板复制和粘贴 - 该函数实际上并不关心您传递的字符串。