如何在Windows中解析规范文件名?

时间:2009-11-29 20:38:00

标签: windows filenames

如果我有一个解析为Windows中文件路径的字符串,是否有可接受的方式来获取文件名的规范形式?

例如,我想知道是否

C:\stuff\things\etc\misc\whatever.txt

C:\stuff\things\etc\misc\other\..\whatever.txt

实际上指向同一个文件,并在我的应用程序中存储路径的规范形式。

请注意,简单的字符串比较不起作用,也不会有任何RegEx魔法。请记住,自Windows 2000以及Windows 7中的新库结构以来,我们需要处理NTFS reparse points之类的事情。

8 个答案:

答案 0 :(得分:9)

简短回答:不是真的。

没有简单的方法可以在Windows上获取文件的规范名称。可以通过重新分析点通过SUBST获得本地文件。你想处理NTFS交叉点吗? Windows快捷方式?那么\\?\ - 转义文件名

怎么样?

远程文件可通过映射的驱动器号或UNC获得。这是UNC到原始服务器吗?你在使用DFS吗?服务器是否使用重新分析点等?服务器是否有多个名称? IP地址怎么样?它有多个IP地址吗?

因此,如果您正在寻找类似Windows上的inode编号,那就不存在了。例如,请参阅this page

答案 1 :(得分:4)

罗杰是对的,没有简单的方法。如果卷支持文件唯一文件索引,则可以打开该文件并调用GetFileInformationByHandle,但这不适用于所有卷。

Windows API调用GetFullPathName可能是最简单的方法。

答案 2 :(得分:3)

使用FileInfo(C#中的示例):

FileInfo info1 = new FileInfo(@"C:\stuff\things\etc\misc\whatever.txt");
FileInfo info2 = new FileInfo(@"C:\stuff\things\etc\misc\other\..\whatever.txt");
if (info1.FullName.Equals(info2.FullName)) {
    Console.WriteLine("yep, they're equal");
}
Console.WriteLine(info1.FullName);
Console.WriteLine(info2.FullName);

输出是:

  是的,他们是平等的   C:\东西\东西\等\其它\ whatever.txt
  C:\东西\东西\等\杂项\ whatever.txt

答案 3 :(得分:3)

GetFinalPathNameByHandle似乎可以满足您的要求,从Windows Vista开始提供。

答案 4 :(得分:1)

jheddings有一个很好的答案,但由于你没有说明你正在使用哪种语言,我以为我会用Python方式来执行它,也可以从命令行使用os.path.abspath:< / p>

> python -c "import os.path; print os.path.abspath('C:\stuff\things\etc\misc\other\..\whatever.txt')"
C:\stuff\things\etc\misc\whatever.txt

答案 5 :(得分:0)

我会使用System.IO.Path.GetFullPath。它需要一个字符串作为输入(C:\ stuff \ things \ etc \ misc \ other .. \ whatever.txt在你的情况下)并将输出一个字符串(C:\ stuff \ things \ etc \ misc \ whatever.txt )。

答案 6 :(得分:0)

我想我迟到了,但你可以使用System.IO.Path.GetFullPath(&#34; C:\ stuff \ things \ etc \ misc \ other .. \ whatever.txt&#34; )它将返回&#34; C:\ stuff \ things \ etc \ misc \ whatever.txt&#34;

答案 7 :(得分:-1)

要获得规范路径,您应该使用PathCanonicalize函数。