Проверка равенства пути с помощью.Net

Каков наилучший способ сравнить два пути в.Net, чтобы выяснить, указывают ли они на один и тот же файл или каталог?

  1. Как бы проверить, что они одинаковы:

    c:\Some Dir\SOME FILE.XXX
    C:\\\SOME DIR\some file.xxx
    
  2. Еще лучше: есть ли способ проверить, что эти пути указывают на один и тот же файл на каком-либо сетевом диске:

    h:\Some File.xxx
    \\Some Host\Some Share\Some File.xxx
    

ОБНОВИТЬ:

Кент Боогаарт правильно ответил на мой первый вопрос; но мне все же интересно узнать, есть ли решение моего второго вопроса о сравнении путей файлов и каталогов на сетевом диске.

ОБНОВЛЕНИЕ 2 (комбинированные ответы по моим двум вопросам):

Вопрос 1: локальные и/или сетевые файлы и каталоги

c:\Some Dir\SOME FILE.XXX
C:\\\SOME DIR\some file.xxx

Ответ: используйте System.IO.Path.GetFullPath как показано на примере:

var path1 = Path.GetFullPath(@"c:\Some Dir\SOME FILE.XXX");
var path2 = Path.GetFullPath(@"C:\\\SOME DIR\subdir\..\some file.xxx");

// outputs true
Console.WriteLine("{0} == {1} ? {2}", path1, path2, string.Equals(path1, path2, StringComparison.OrdinalIgnoreCase));

Вопрос 2: локальные и/или сетевые файлы и каталоги

Ответ. Используйте метод GetPath, как показано на странице http://briancaos.wordpress.com/2009/03/05/get-local-path-from-unc-path/.

Ответ 1

var path1 = Path.GetFullPath(@"c:\Some Dir\SOME FILE.XXX");
var path2 = Path.GetFullPath(@"C:\\\SOME DIR\subdir\..\some file.xxx");

// outputs true
Console.WriteLine("{0} == {1} ? {2}", path1, path2, string.Equals(path1, path2, StringComparison.OrdinalIgnoreCase));

Игнорирование дела - это только хорошая идея в Windows. Вы можете использовать FileInfo.FullName аналогичным образом, но Path будет работать как с файлами, так и с каталогами.

Не уверен в вашем втором примере.

Ответ 2

Хотя это старая проводка, как я ее нашел.

Используя Path.GetFullpath, я мог бы решить свой вопрос, например.

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))

Ответ 3

вы можете использовать FileInfo!

string Path_test_1="c:\\main.h";
string Path_test_2="c:\\\\main.h";

var path1=new FileInfo(Path_test_1)
var path2=new FileInfo(Path_test_2)
if(path1.FullName==path2.FullName){

//two path equals
}

Ответ 4

Как сообщают другие, Path.GetFullPath или FileInfo.FullName предоставляют нормализованные версии локальных файлов. Нормализация пути UNC для сравнения довольно немного сложнее, но, к счастью, Брайан Педерсен опубликовал удобный MRU (метод, готовый к использованию), чтобы сделать именно то, что вам нужно в своем блоге, точно под названием " Получить локальный путь из UNC-пути". После того, как вы добавите это в свой код, вы получите статический метод GetPath который берет UNC-путь в качестве единственного аргумента и нормализует его до локального пути. Я быстро его попробовал, и он работает как рекламируемый.

Ответ 5

Хороший синтаксис с использованием методов расширения

У вас может быть хороший синтаксис:

string path1 = @"c:\Some Dir\SOME FILE.XXX";
string path2 = @"C:\\\SOME DIR\subdir\..\some file.xxx";

bool equals = path1.PathEquals(path2); // true

С внедрением метода расширения:

public static class StringExtensions {
    public static bool PathEquals(this string path1, string path2) {
        return Path.GetFullPath(path1)
            .Equals(Path.GetFullPath(path2), StringComparison.InvariantCultureIgnoreCase);
    }
}

Благодаря Kent Boogaart для приятных примеров.

Ответ 6

Только один способ убедиться, что два пути ссылаются на один и тот же файл, - это открыть и сравнить файлы. По крайней мере, вы можете создать экземпляр объекта FileInfo и сравнить такие свойства, как CreationTime, FullName, Size и т.д. В некотором приближении это дает вам гарантию того, что два пути ссылаются на один и тот же файл.

Ответ 7

Почему бы не создать хэш каждого файла и сравнить их? Если они одинаковы, вы можете быть уверены, что они являются одним и тем же файлом.