【问题标题】:What is the right way to compare two filenames to see if they are the same file? [duplicate]比较两个文件名以查看它们是否是同一个文件的正确方法是什么? [复制]
【发布时间】:2009-11-17 18:55:13
【问题描述】:

可能重复:
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:\程序文件\applic~1\app.exe

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

更新:

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

【问题讨论】:

    标签: c# .net comparison filenames


    【解决方案1】:

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

    【讨论】:

    • 在你被否决之前快点删除它...
    • 这里对我有用。我试过 c:\Progra~1\Refere~1\Microsoft 和 c:\Program Files\Referenced Assemblies\microsoft...
    • 显然他试过了。我发布了同样的内容并立即获得了 3 次反对。
    • 我将我的测试及其输出添加到答案中,以防万一。谢谢。
    • @xaero 当问题说“我尝试了 GetFullPath”时,您基本上发布了“尝试 GetFullPath”。 Gonzalo 包含必要的不区分大小写的比较,这可能是它不适用于 OP 和示例代码的原因。
    【解决方案2】:

    一个简短的测试运行表明以下代码将适用于给定的路径:

    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 为中心的路径而做出的假设)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2015-10-14
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        相关资源
        最近更新 更多