使用WinAPI规范化文件路径

时间:2009-03-26 06:08:25

标签: c++ c windows winapi path

  

可能重复:
  Best way to determine if two path reference to same file in C/C++

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

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

4 个答案:

答案 0 :(得分:6)

我可以建议PathCanonicalize吗?

答案 1 :(得分:6)

我找到了一篇博客文章,其中包含了我所见过的解决此问题的最全面,最精细的功能。它可以处理任何事情,甚至像V:foo.txt那样使用subst命令将V:映射到Z:,但您已使用subst来映射Z:等可怕的角落案例1}}到其他驱动器;它会循环,直到所有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() 否则,将“./”复制到临时缓冲区,然后将文件名复制到临时缓冲区+ 2,以获取前缀为“./”的文件名副本,然后调用GetLongPathName()。

答案 2 :(得分:4)

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

编辑:我同意RBerteig的评论,如果路径未指向本地文件,则可能很难做到这一点。任何关于如何安全处理此案件的评论都将不胜感激。

答案 3 :(得分:3)

有奇怪的情况。例如,“c:\ windows .. \ data \ myfile.txt”与“c:\ data。\ myfile.txt”和“c:\ data \ myfile.txt”相同。你可以在那里有任意数量的“\。\”和“\ .. \”。您可以查看Windows API函数GetFullPathName。它可能会为你做规范化。