¿Cómo se puede conseguir una ruta de archivo absoluta o normalizada en .NET?
Pregunta
¿Cómo puede uno con un mínimo esfuerzo (utilizando alguna instalación ya existente, si es posible) convertir senderos como c:\aaa\bbb\..\ccc
a c:\aaa\ccc
?
Solución
Path.GetFullPath
tal vez?
Otros consejos
Me gustaría escribir así:
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
Esto debe manejar algunos escenarios como
-
URI y el potencial escaparon caracteres en ella, como
file: /// C: /Test%20Project.exe -> C: \ TEST PROJECT.EXE
-
Los segmentos de trazado especificados por puntos para denotar actual o directorio padre
c: \ aaa \ bbb \ .. \ ccc -> C: \ AAA \ CCC
-
tilde acortados caminos (largos)
C: \ Progra ~ 1 \ -> C: \ Archivos de programa
-
directorio inconsistente carácter delimitador
C: / Documents \ abc.txt -> C: \ Documents \ abc.txt
Aparte de estos, se puede ignorar el caso, por detrás directorio \
delimitador de caracteres, etc.
Canonicalización es una de las principales responsabilidades de la Uri clases en .NET.
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc