Solución:
El objetivo de hacer cualquier cosa “canónico” es para que puedas comparar dos cosas. Por ejemplo, ambos ../../here/bar/x
y ./test/../../bar/x
puede referirse a la misma ubicación, pero no puede hacer una comparación textual en las dos rutas. Sin embargo, si los convierte en su representación canónica, ambos se vuelven ../bar/x
y vemos que en realidad se refieren a lo mismo.
En resumen, a menudo ocurre que tiene muchas formas de referirse a una cosa, y en ese caso es posible que pueda definir una representación canónica cual es único y que le permite controlar las colecciones de tales cosas.
(Si está buscando más ejemplos, todas las matemáticas están llenas de construcciones “canónicas” para todo tipo de objetos, y en gran medida con el mismo propósito en mente. Tal vez este artículo de Wikipedia pueda proporcionar algunas instrucciones adicionales).
Una buena forma de definir una ruta canónica será: the shortest absolute path
(corto, en el sentido de longitud de cadena).
Este es un ejemplo de la diferencia entre una ruta absoluta y una canónica:
camino absoluto: C:abc..abcfile.txt
camino canónico: C:abcfile.txt
Lo que es una ruta canónica (o su diferencia de una ruta absoluta) depende del sistema.
Normalmente, si una ruta (completa) contiene alias, atajos o enlaces simbólicos, la ruta canónica resuelve todos estos en los directorios reales a los que hacen referencia.
Ejemplo: si /bin/a
es un enlace simbólico, puede encontrarlo en cualquier lugar que solicite una ruta absoluta, por ejemplo, desde java.io.File # getAbsolutePath mientras que el archivo real (es decir, el objetivo real del enlace), es decir usr/local/bin/a
sería devuelto como una ruta canónica, por ejemplo, desde java.io.File # getCanonicalPath