GetLongPathName和GetFullPathName在WinAPI中有什么区别?

7

要确定相对路径或路径中包含\..\的文件的规范路径,stackoverflow建议在此处使用GetFullPathName() 或在此处使用GetLongPathName()

这些函数之间有什么区别?

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


6
你尝试过阅读例如 GetFullPathNameGetLongPathName 的参考资料吗? - Some programmer dude
1
@JoachimPileborg,是的。你有吗?通过阅读参考资料来可靠地捕捉差异并不容易。我认为对于那些具有双方经验的人来说,解释会更容易些。问题出在例如PathCanonicalize上,它的名称表明它几乎可以规范化路径,但实际上并非如此。只有在调试中我才意识到这一点,然后再次阅读参考资料并意识到PathCanonicalize的奇怪行为在哪里记录。 - Serge Rogatch
1
我花了几分钟看那些参考资料,但只降低了我的信心,以至于我无法权威地解释其中的区别。我期待着学到答案。 - Drew Dormann
1
据我所知,一个主要的区别是GetFullPathName不进行长/短名称转换。因此,如果您有verlongnamehere并将其作为verylo~1传递,则GetFullPathName将其返回为verylo~1,而GetLongPathName将其转换为长版本verlongnamehere(而GetShortPathNameverlongnamehere返回为verylo~1)。此外,GetFullPathName似乎使用一些全局状态或类似的东西,使其无法从DLL中使用或线程安全。 - Some programmer dude
@JoachimPileborg,GetLongPathName()如何将相对路径规范化而不获取当前目录(即“全局状态”)? - Serge Rogatch
谁知道这是不是唯一的全局状态呢?另外,GetLongPathName的参考资料并没有说明它实际上解析相对路径,它只是将路径从短格式转换为长格式。 GetFullPathName实际上执行了相对到绝对路径名解析,然后可以传递给GetLongPathNameGetShortPathName - Some programmer dude
1个回答

9

GetFullPathName函数将文件名和相对路径名解析为绝对路径,通过在调用进程的当前工作目录前置来实现。

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

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

简而言之:
调用GetFullPathName函数将相对路径解析为绝对路径。
调用GetLongPathName函数将可能包含短(8.3)名称的绝对路径解析为长名称形式。


请注意:

当前工作目录是每个进程的资源,可以被更改,例如通过标准文件打开对话框。我建议仅将其用于解析可能相对于程序启动时的CWD的命令行参数。

并非每个8.3命名的文件都有长路径名。


2
文档中说 GetFullPathName不会转换指定的文件名lpFileName。如果指定的文件名存在,可以使用GetLongPathName或GetShortPathName分别转换为长路径名或短路径名。 这似乎与这个答案的第二段相矛盾。 - David Heffernan
糟糕!删除了不正确的信息,感谢@DavidHeffernan。 - peterchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接