WinAPI 中的 GetLongPathName 和 GetFullPathName 有啥区别?

Posted

技术标签:

【中文标题】WinAPI 中的 GetLongPathName 和 GetFullPathName 有啥区别?【英文标题】:What is the difference between GetLongPathName and GetFullPathName in WinAPI?WinAPI 中的 GetLongPathName 和 GetFullPathName 有什么区别? 【发布时间】:2015-09-23 18:53:25 【问题描述】:

为了确定由相对路径或中间包含\..\的路径指定的文件的规范路径,***建议使用GetFullPathName() here或GetLongPathName() here。

这些功能有什么区别?

目的是从相对路径(如..\someDir\someFile.txtsomeOtherDir\someFile.txt)获取以驱动器号开头的路径,并从路径中消除额外的\..\(如C:\dirA\dirB\..\someFile.txt -> C:\dirA\someFile.txt)。

【问题讨论】:

您是否尝试过阅读参考文献,例如GetFullPathNameGetLongPathName? @JoachimPileborg,是的。你?通过阅读参考资料来可靠地捕捉差异并不容易。我认为对于两者都有经验的人来说更容易解释。问题出在例如PathCanonicalize 几乎没有规范化路径,但是它的名字是这样说的。只有在 Debug 中我才意识到这一点,然后再次阅读参考并意识到 PathCanonicalize 的奇怪行为记录在哪里。 我在这些参考资料上花了几分钟,我的信心只下降了,我可以权威地解释差异。我期待着了解答案。 据我了解,一个主要区别是GetFullPathName 不进行长/短名称转换。因此,如果您有verlongnamehere 并将其传递为verylo~1,则GetFullPathName 将其返回为verylo~1,而GetLongPathName 将其转换为长版本verlongnamehere(并且GetShortPathNameverlongnamehere 返回为verylo~1 )。此外,GetFullPathName 似乎正在使用某种全局状态等,使其非线程安全或可从 DLL 中使用。 @JoachimPileborg,GetLongPathName() 如何在不获取当前目录(“全局状态”)的情况下规范化相对路径? 【参考方案1】:

GetFullPathName 通过添加调用进程的当前工作目录,将文件名和相对路径名解析为绝对路径。

GetLongPathName 仅将短 (8.3) 名称解析为长名称。

请注意,后者需要访问磁盘,因此也可能通过使用当前工作目录来解析相对路径。

tl;博士: 调用GetFullPathName 将相对路径解析为绝对路径。 调用GetLongPathName 将可能包含短(8.3)名称的绝对路径解析为长名称形式。


小心:

当前工作目录是每个进程的资源,可以更改,例如通过标准文件打开对话框。我会使用这个 only 来解析可能与启动程序的 CWD 相关的命令行参数。

对于每个 8.3 命名文件,可能不存在长路径名。

【讨论】:

看来您是对的,pdh11.blogspot.com/2009/05/… 此处的文字确认“计划是,使用 GetFullPathName() 将相对路径转换为绝对路径,然后反复调用 QueryDosDevice() 来展开 subst'd驱动器号,然后调用 GetLongPathName() 以摆脱 8.3-ness 和规范化大小写”。因此,GetLongPathName() 仅当相对路径以 ... 开头时才将其规范化。 文档说 GetFullPathName 不会转换指定的文件名 lpFileName。如果指定的文件名存在,则可以使用 GetLongPathName 或 GetShortPathName 分别转换为长路径名或短路径名。这似乎与此答案的第二段相矛盾。 天啊!删除了不正确的信息,谢谢@DavidHeffernan

以上是关于WinAPI 中的 GetLongPathName 和 GetFullPathName 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

WinApi中的GetClientRect和GetWindowRect有啥区别?

WinAPI 中的 sz 和 pwsz 前缀

WinAPI 中的加速器,带有 2 个字母键

WINAPI中的消息部署函数应该设置啥样的参数

winapi中多行编辑中的意外行为

C++/WinAPI 中的 .NET WebClient.DownloadData(url) 替代方案?