使用WinAPI规范化文件路径

Ale*_*x B 11 c c++ windows winapi path

可能重复:
确定两个路径是否引用C/C++中相同文件的最佳方法

给定两个具有可能不同的大小写和斜杠('\'vs '/')的文件路径字符串,是否有一种快速的方法(不涉及编写我自己的函数)来规范化到同一形式的两个路径,或者至少测试它们的等效性?

我受限于WinAPI和标准C++.所有文件都是本地的.

i_a*_*orf 6

我可以建议PathCanonicalize吗?

  • 在查看了这个答案之后,我尝试使用PathCanonicalize()并发现它被破坏了.`PathCanonicalize("../ foo.txt")`总是返回`/ foo.txt`!PathCanonicalize()只对字符串进行简单的编辑,上面的破坏是记录的行为.无用.我将用我发现的内容发布另一个答案. (6认同)

ste*_*eha 6

我找到了一篇博客文章,其中包含了我所见过的解决此问题的最全面,最精细的功能.它处理任何事情,甚至可怕的角落情况,例如V:foo.txt你使用subst命令映射V:到的地方,Z:但你已经习惯subst映射Z:到其他驱动器; 它会循环,直到所有subst命令都被解开.网址:

http://pdh11.blogspot.com/2009/05/pathcanonicalize-versus-what-it-says-on.html

我的项目是纯C代码,该函数是C++.我开始翻译它,但后来我发现我可以通过一个函数调用得到我想要的规范化路径:GetLongPathName().这不会处理可怕的角落案件,但它处理了我的迫切需要.

我发现GetLongPathName("foo.txt")只是返回foo.txt,但只是通过./在文件名前加上我得到了规范化形式的扩展:

GetLongPathName("./foo.txt"),如果在目录中执行C:\Users\steveha,则返回C:\Users\steveha\foo.txt.

所以,在伪代码中:

如果路径名的第二个字符是':'或第一个字符是'/'或'\',只需调用GetLongPathName()else,将"./"复制到临时缓冲区,然后将文件名复制到临时缓冲区+ 2 ,获取前缀为"./"的文件名副本,然后调用GetLongPathName().

  • 为什么不是`GetFullPathName()`?https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx (2认同)

mgh*_*hie 5

根据路径是否可以是相对的,或包含“..”,或连接点,或 UNC 路径,这可能比您想象的更困难。最好的方法可能是使用本答案中GetFileInformationByHandle()函数。

编辑:我同意 RBerteig 的评论,即如果路径不指向本地文件,这可能变得很难甚至不可能做到。任何有关如何安全处理此案例的评论将不胜感激。