如果我有一个解析为Windows中文件路径的字符串,是否有可接受的方式来获取文件名的规范形式?
例如,我想知道是否
C:\stuff\things\etc\misc\whatever.txt
和
C:\stuff\things\etc\misc\other\..\whatever.txt
实际上指向同一个文件,并在我的应用程序中存储路径的规范形式。
请注意,简单的字符串比较不起作用,也不会有任何RegEx魔法。请记住,自Windows 2000以及Windows 7中的新库结构以来,我们需要处理NTFS reparse points之类的事情。
答案 0 :(得分:9)
简短回答:不是真的。
没有简单的方法可以在Windows上获取文件的规范名称。可以通过重新分析点通过SUBST获得本地文件。你想处理NTFS交叉点吗? Windows快捷方式?那么\\?\
- 转义文件名
远程文件可通过映射的驱动器号或UNC获得。这是UNC到原始服务器吗?你在使用DFS吗?服务器是否使用重新分析点等?服务器是否有多个名称? IP地址怎么样?它有多个IP地址吗?
因此,如果您正在寻找类似Windows上的inode编号,那就不存在了。例如,请参阅this page。
答案 1 :(得分:4)
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函数。