Как можно с минимальными усилиями (используя какое-то уже существующее средство, если это возможно) конвертировать пути типа c:\aaa\bbb\..\ccc
в c:\aaa\ccc
?
Как можно получить абсолютный или нормализованный путь к файлу в .NET?
Ответ 1
Path.GetFullPath
возможно?
Ответ 2
Я бы написал это следующим образом:
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
Это должно обрабатывать несколько сценариев, таких как
-
uri и потенциально экранированные символы, например
file:///C:/Test%20Project.exe → C:\TEST PROJECT.EXE
-
сегменты пути, заданные точками, для обозначения текущего или родительского каталога
c:\aaa\bbb \..\ccc → C:\AAA\CCC
-
укороченные (длинные) дорожки тильды
C:\Progra ~ 1\- > C:\PROGRAM FILES
-
несогласованный символ разделителя каталогов
C:/Documents\abc.txt → C:\DOCUMENTS\ABC.TXT
Кроме этого, он может игнорировать регистр, обращаясь к символу разделителя \
и т.д.
Ответ 3
Canonicalization является одной из основных обязанностей класса Uri в .NET.
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc