Как правильно сравнить два имени файлов, чтобы узнать, являются ли они одним и тем же файлом? [дубликат]

Возможные Дубликаты:
лучший способ определить, ссылаются ли два пути на один и тот же файл в C#

поэтому у меня есть два имени файлов Windows, которые мне нужно сравнить, чтобы определить, одинаковы ли они. Один пользователь дал мне, один дал мне другая программа. Так как же!--11-->должны вы сравниваете:

C:Program FilesApplication1APP.EXE
C:Progra~1Applic~1APP.EXE
C:program filesapplic~1app.exe

Я не могу найти способ последовательно "нормализовать" путь, я попытался использовать путь.GetFullPath(путь) и новый FileInfo может(Путь).FullName и, похоже, не решает этого.

обновление:

путь.GetFullPath (путь) исправит преобразование короткого в длинное имя, но не нормализует регистр. Таким образом, StringComparer.OrdinalIgnoreCase.Требуется Equals (path1, path2).

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

короткий тестовый запуск говорит, что приведенный ниже код будет работать для заданных путей:

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, приведенных в качестве примера путей)


Я использую объект FileInfo. Если вы создаете объект fileinfo файла, который фактически существует, свойство Directory дает красиво отформатированное имя пути.

вы также получаете дополнительное преимущество в возможности проверить, действительно ли файл существует.