使用WinAPI规范化文件path

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

给定两个文件pathstring可能具有不同的shell和斜杠( '\''/' ),是否有一个快速的方法(不涉及编写我自己的函数)将两个path规范化为相同的forms,或者至lesstesting他们的等值?

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

Solutions Collecting From Web of "使用WinAPI规范化文件path"

根据路径是否可以是相对路径,或包含“..”,交点或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 。 它可能会为你做标准化。