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

时间:2009-11-17 18:55:14

标签: c# .net comparison filenames

  

可能重复:
  Best way to determine if two path reference to same file in C#

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

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

我似乎无法找到一种方法来始终“规范化”路径,我尝试使用Path.GetFullPath(路径)和新的FileInfo(路径).FullName,似乎都没有解决这个问题。

更新:

Path.GetFullPath(path)将更正短到长名称转换,但不会对大小写进行规范化。因此需要StringComparer.OrdinalIgnoreCase.Equals(path1,path2)。

3 个答案:

答案 0 :(得分:3)

您需要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

答案 1 :(得分: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平台(由于以窗口为中心的路径作为示例路径而做出的假设)

答案 2 :(得分:0)

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

您还可以获得测试文件是否确实存在的额外好处。