2009-08-12 10 views

Respuesta

23

Path.GetFullPath ¿quizás?

+3

No creo que esto garantice la devolución de un nombre canónico. Solo garantiza que el nombre devuelto se puede usar para hacer referencia al archivo absolutamente en comparación con relativamente – JaredPar

+1

Path.GetFullPath (@ "c: \ aaa \ bbb \ .. \ ccc") = c: \ aaa \ ccc - lo suficientemente bueno para mí. – mark

+0

Correcto, pero no comprueba si la ruta es válida. –

16

Canonicalization es una de las principales responsabilidades de la clase Uri en .NET.

var path = @"c:\aaa\bbb\..\ccc"; 
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc 
+0

Entonces, ¿supongo que esto comprueba que la ruta realmente existe? – ashes999

+3

No, la clase 'Uri' solo es responsable de generar rutas. El sistema contra el cual esas rutas son relevantes no se toma en cuenta.Una vez que obtengas la ruta a través del método en mi respuesta, igual deberías verificar que exista a través de la clase 'Archivo' (o lo que sea). – bdukes

+6

Tenga en cuenta que aún no se normaliza el caso de letra de unidad (por ejemplo, "C: \" y "c: \" ambos salen inalterados). Así que esto no es realmente "canónico" en el sentido de ser único, en cualquier caso. –

44

lo escribiría así:

public static string NormalizePath(string path) 
{ 
    return Path.GetFullPath(new Uri(path).LocalPath) 
       .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) 
       .ToUpperInvariant(); 
} 

Esto debería manejar algunos escenarios como

  1. URI y el potencial caracteres de escape en ella, como

    archivo : /// C: /Test%20Project.exe -> C: \ TEST PROJECT.EXE

  2. segmentos de trazado especificados por puntos para denotar directorio actual o el padre

    c: \ aaa \ bbb \ .. \ ccc -> C: \ AAA \ CCC

  3. tilde acortar caminos (largos)

    C: \ Progra ~ 1 \ -> C: \ Archivos de programa

  4. inconsistente carácter delimitador de directorio

    C:/Documents \ abc.txt -> C: \ Documents \ abc.txt

Aparte de estos, se puede ignorar el caso , \, carácter delimitador de directorios, etc.

+1

Solución buena y concisa para la normalización de rutas, exactamente lo que estaba buscando. +1 – Syon

+13

No use ToUpper() ni sus amigos para ningún código que desee que sea portátil. Hay sistemas de archivos sensibles a mayúsculas y minúsculas en el mundo. Además, no es tan agradable si muestra estos valores a los usuarios, en cuyo caso desea preservar el uso de mayúsculas/minúsculas y utilizar clasificaciones y comparaciones insensibles a mayúsculas y minúsculas. De lo contrario, se ve bien. – dhasenan

+2

Depende de exactamente lo que quiere decir con "canónico" pero, dado que Windows trata las rutas de archivos como insensibles a mayúsculas/minúsculas, yo argumentaría que * do * necesita una conversión de caso, de lo contrario es posible que haya más de una ruta "canónica" para el mismo archivo. Yo preferiría minúsculas sin embargo. – Andy

Cuestiones relacionadas