可能重复:
确定两个path是否在C / C ++中引用同一文件的最佳方法
给定两个文件pathstring可能具有不同的shell和斜杠( '\'
和'/'
),是否有一个快速的方法(不涉及编写我自己的函数)将两个path规范化为相同的forms,或者至lesstesting他们的等值?
我仅限于WinAPI和标准C ++。 所有文件都是本地的。
根据路径是否可以是相对路径,或包含“..”,交点或UNC路径,这可能比您想象的要困难得多。 最好的方法可能是在这个答案中使用GetFileInformationByHandle()函数。
编辑:我同意RBerteig的评论,如果路径不指向本地文件,这可能变得很难做到。 任何评论如何安全地处理这种情况将不胜感激。
我可以建议PathCanonicalize ?
我发现了一篇博客文章,用我所见过的最彻底,更精细的功能解决了这个问题。 它可以处理任何事情,甚至可怕的角落案例,如V:foo.txt
,其中使用subst
命令将V:
映射到Z:
但是您已经使用subst
来将Z:
映射到其他驱动器; 它会循环,直到所有的子命令解开。 网址:
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()。
有奇怪的情况。 例如,“c:\ windows .. \ data \ myfile.txt”与“c:\ data。\ myfile.txt”和“c:\ data \ myfile.txt”相同。 你可以有任何数量的“\。\”和“\ .. \”。 您可以查看Windows API函数GetFullPathName
。 它可能会为你做标准化。