比较两个文件名以确定它们是否是同一文件的正确方法是什么?

8

可能是重复问题:
在C#中确定两个路径是否引用同一文件的最佳方法

我有两个Windows文件名需要比较,以确定它们是否相同。一个是用户提供给我的,另一个是其他程序提供给我的。那么应该如何进行比较呢:

C:\Program Files\Application1\APP.EXE
C:\Progra~1\Applic~1\APP.EXE
C:\program files\applic~1\app.exe

我似乎找不到一种一致地“规范化”路径的方法,我尝试使用Path.GetFullPath(path)和new FileInfo(path)。FullName,但两者都无法解决这个问题。

更新:

Path.GetFullPath(path)将纠正短名称转换为长名称,但它不会规范化大小写。因此,需要使用StringComparer.OrdinalIgnoreCase.Equals(path1,path2)。

3个回答

4
你需要使用Path.GetFullPath()方法并进行不区分大小写的字符串比较。
运行以下代码:
using System;
using System.IO;

class Test {
 static void Main ()
 {
  //string [] str = new string[] {@"c:\program files\vim\vim72", @"c:\progra~1\vim\vim72"};
  string [] str = new string[] {@"c:\program files\Refere~1\microsoft", @"c:\progra~1\Refere~1\microsoft"};
  foreach (string s in str) {
   // Call s = Environment.ExpandEnvironmentVariables (s) if needed.
   Console.WriteLine (Path.GetFullPath (s));
  }
 }
}

提供:

c:\program files\Reference Assemblies\microsoft
c:\Program Files\Reference Assemblies\microsoft

在你被踩得体无完肤之前,赶紧删除这个快速回复... - Philip Wallace
@Tim - 好的,没关系。反正我删除了我的帖子,还得到了一个徽章... ;) - Philip Wallace
另外,我没有尝试过,但是GetFullPath可能不支持最近版本的NTFS支持的联接或链接。虽然对于99.9%的人来说可能不是问题。 - Tim Sylvester
是的,我考虑过Unix中的连接点和符号链接,但认为没有必要提及。 - Gonzalo
我经常使用它们,但这绝对不是常见的做法,你基本上必须使用非微软软件才能在命令行之外完成它,例如:http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html - Tim Sylvester
显示剩余9条评论

0
一个简短的测试运行表明,下面的代码将适用于给定的路径:
bool CompareFileName(string file1, string file2)
        {
            var directory1 = Path.GetDirectoryName(file1);
            var directory2 = Path.GetDirectoryName(file2);
            var fileName1 = Path.GetFileName(file1);
            var fileName2 = Path.GetFileName(file2);

            return directory1.Equals(directory2, StringComparison.InvariantCultureIgnoreCase) &&
                   fileName1.Equals(fileName2, StringComparison.InvariantCultureIgnoreCase);
        }

这假设是Windows平台(由于给出的示例路径是以Windows为中心的路径而做出的假设)


0

我使用FileInfo对象。如果您创建了一个实际存在的文件的fileinfo对象,则Directory属性会给出一个格式良好的路径名。

您还可以获得额外的好处,即能够测试文件是否实际存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接