Come si può ottenere un percorso assoluto o normalizzata in .NET?
Domanda
Come si può con il minimo sforzo (utilizzando qualche struttura già esistente, se possibile) di convertire percorsi come c:\aaa\bbb\..\ccc
a c:\aaa\ccc
?
Soluzione
Path.GetFullPath
forse?
Altri suggerimenti
vorrei scrivere in questo modo:
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
Questo dovrebbe gestire alcuni scenari come
-
uri e il potenziale fuggiti personaggi in esso, come
file: /// C: /Test%20Project.exe -> C: \ TEST Project.exe
-
segmenti di percorso specificati da puntini per indicare corrente o directory padre
c: \ aaa \ bbb \ .. \ ccc -> C: \ AAA \ CCC
-
accorciati i percorsi (lunghi) tilde
C: \ Progra ~ 1 \ -> C: \ PROGRAMMI
-
directory incoerente carattere delimitatore
C: / Documents \ abc.txt -> C: \ Documents \ abc.txt
Diversi da quelli, si può ignorare caso, trailing carattere directory \
delimitatore etc.
La canonizzazione è una delle principali responsabilità del Uri classe .NET.
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc