Проверка равенства пути с помощью.Net
Каков наилучший способ сравнить два пути в.Net, чтобы выяснить, указывают ли они на один и тот же файл или каталог?
-
Как бы проверить, что они одинаковы:
c:\Some Dir\SOME FILE.XXX
C:\\\SOME DIR\some file.xxx
-
Еще лучше: есть ли способ проверить, что эти пути указывают на один и тот же файл на каком-либо сетевом диске:
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
Почему бы не создать хэш каждого файла и сравнить их? Если они одинаковы, вы можете быть уверены, что они являются одним и тем же файлом.