¿Cómo puede uno con un esfuerzo mínimo (utilizando algunas instalaciones ya existentes, si es posible) convertir rutas como c:\aaa\bbb\..\ccc
a c:\aaa\ccc
?¿Cómo se puede obtener una ruta de archivo absoluta o normalizada en .NET?
Respuesta
Path.GetFullPath
¿quizás?
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
Entonces, ¿supongo que esto comprueba que la ruta realmente existe? – ashes999
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
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. –
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
URI y el potencial caracteres de escape en ella, como
archivo : /// C: /Test%20Project.exe -> C: \ TEST PROJECT.EXE
segmentos de trazado especificados por puntos para denotar directorio actual o el padre
c: \ aaa \ bbb \ .. \ ccc -> C: \ AAA \ CCC
tilde acortar caminos (largos)
C: \ Progra ~ 1 \ -> C: \ Archivos de programa
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.
Solución buena y concisa para la normalización de rutas, exactamente lo que estaba buscando. +1 – Syon
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
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
- 1. Cómo obtener una ruta de archivo absoluta en Python
- 2. Obtener nombre de archivo y extensión desde una ruta absoluta
- 3. En un archivo MAKE, ¿cómo obtener la ruta relativa de una ruta absoluta a otra?
- 4. cómo obtener una ruta absoluta para una imagen en drupal?
- 5. WIN32_FIND_DATA - Obtener la ruta absoluta
- 6. cómo obtener la ruta absoluta para el archivo symlink?
- 7. utiliza una ruta absoluta o relativa?
- 8. Obtener ruta absoluta con boost :: filesystem :: ruta
- 9. Android obtener la aceleración normalizada
- 10. ¿Cómo obtener la ruta de acceso absoluta del archivo o directorio, que * no * existe?
- 11. Obtener ruta absoluta de una url en java
- 12. ¿Cómo obtener la ruta absoluta del archivo desde la ruta base y relativa que contiene ".."?
- 13. archivos por lotes: Obtener ruta absoluta
- 14. ¿Cómo obtener la ruta absoluta de la ruta con variables de ruta del sistema?
- 15. ¿Cómo convertir una ruta relativa a una ruta absoluta en una aplicación de Windows?
- 16. Ruta de archivo absoluta a URL relativa
- 17. ¿Cómo obtener la ruta absoluta de un archivo mediante programación con out realpath() en Linux?
- 18. Cómo quitar la base de una ruta absoluta para obtener una ruta relativa?
- 19. Obtenga la ruta absoluta del archivo editado actualmente en Eclipse
- 20. ¿Cómo se normaliza una ruta en PowerShell?
- 21. Ruta absoluta PHP en requireonce
- 22. ¿Cómo obtener la ruta absoluta para una ruta relativa dada programáticamente en Linux?
- 23. Ruta absoluta y ruta relativa
- 24. Compruebe si una ruta es absoluta o relativa
- 25. Nombre de ruta absoluta en mi plantilla para obtener recursos
- 26. ¿Cómo obtener la URL del archivo de la ruta absoluta en Delphi?
- 27. Carga de datos del archivo desnormalizado en una tabla normalizada
- 28. Obtener URL absoluta de la ruta relativa (método refactorizado)
- 29. Obtener ruta de archivo completa en java
- 30. obtener la ruta absoluta a un archivo mediante el método de crear openFileOutput en Android
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
Path.GetFullPath (@ "c: \ aaa \ bbb \ .. \ ccc") = c: \ aaa \ ccc - lo suficientemente bueno para mí. – mark
Correcto, pero no comprueba si la ruta es válida. –