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.txt
和someOtherDir\someFile.txt
)获取以驱动器号开头的路径,并从路径中消除额外的\..\
(如C:\dirA\dirB\..\someFile.txt
-> C:\dirA\someFile.txt
)。
【问题讨论】:
您是否尝试过阅读参考文献,例如GetFullPathName
和 GetLongPathName
?
@JoachimPileborg,是的。你?通过阅读参考资料来可靠地捕捉差异并不容易。我认为对于两者都有经验的人来说更容易解释。问题出在例如PathCanonicalize 几乎没有规范化路径,但是它的名字是这样说的。只有在 Debug 中我才意识到这一点,然后再次阅读参考并意识到 PathCanonicalize 的奇怪行为记录在哪里。
我在这些参考资料上花了几分钟,我的信心只下降了,我可以权威地解释差异。我期待着了解答案。
据我了解,一个主要区别是GetFullPathName
不进行长/短名称转换。因此,如果您有verlongnamehere
并将其传递为verylo~1
,则GetFullPathName
将其返回为verylo~1
,而GetLongPathName
将其转换为长版本verlongnamehere
(并且GetShortPathName
将verlongnamehere
返回为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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章