可能重复:
Best way to determine if two path reference to same file in C/C++
给定两个具有可能不同的大小写和斜杠('\'
vs '/'
)的文件路径字符串,是否有一种快速的方法(不涉及编写我自己的函数)来规范化两个路径到同一个路径形式,或至少测试它们的等价性?
我受限于WinAPI和标准C ++。所有文件都是本地的。
答案 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
。它可能会为你做规范化。