123 votes

Qu'est-ce qu'un "chemin canonique" ?

Donc, un chemin absolu est un moyen d'accéder à un certain fichier ou emplacement en décrivant la route complète vers celui-ci, le chemin complet, et cela dépend du système d'exploitation (les chemins absolus pour Windows et Linux, par exemple, sont différents). A chemin relatif est un itinéraire vers un fichier ou un emplacement décrit à partir de l'emplacement actuel. .. (deux points) indiquant un niveau supérieur dans l'arbre des répertoires. C'est clair pour moi depuis plusieurs années maintenant.

En cherchant, j'ai même vu qu'il y avait aussi des fichiers canonisés ! Tout ce que je sais, c'est que CANONIQUE signifie quelque chose comme "selon les règles" ou quelque chose comme ça.

Quelqu'un peut-il m'éclairer en termes de théorie sur les trucs canoniques ?

130voto

Kerrek SB Points 194696

Le but de faire tout ce qui est "canonique" est pour que vous puissiez comparer deux choses. Par exemple, les deux ../../here/bar/x y ./test/../../bar/x peuvent se référer au même endroit, mais vous ne pouvez pas faire une comparaison textuelle sur les deux chemins. Cependant, si vous les transformez en leur représentation canonique, ils deviennent tous deux ../bar/x et nous voyons qu'ils se réfèrent en fait à la même chose.

En bref, il arrive souvent que l'on ait plusieurs façons de se référer à une même chose, et dans ce cas, on peut être capable de définir un représentation canonique qui est unique et qui vous permet d'appréhender des collections de ce type.

(Si vous cherchez d'autres exemples, les mathématiques regorgent de constructions "canoniques" pour toutes sortes d'objets, et ce dans le même but. Peut-être que ceci Article de Wikipedia peut fournir quelques indications supplémentaires).

42voto

alfasin Points 19063

Une bonne façon de définir un chemin canonique sera : the shortest absolute path (court, au sens de longueur de chaîne).

Ceci est un exemple de la différence entre un chemin absolu et un chemin canonique :

chemin absolu : C:\abc\..\abc\file.txt
chemin canonique : C:\abc\file.txt

10voto

tlake29 Points 11

Une bonne définition d'un chemin canonique est donnée dans le document documentation de readlink dans GNU Coreutils. Il est spécifié que 'Canonicalize mode' retourne un chemin équivalent qui n'a aucune de ces choses :

  1. liens solides vers les répertoires self (.) et parent (..)
  2. séparateurs répétés (/)
  3. liens symboliques

La longueur de la chaîne n'a aucune importance, comme le montre l'exemple suivant.

Vous pouvez expérimenter avec readlink -f (mode canonicalize) ou sa commande équivalente préférée realpath pour voir la différence entre un "chemin absolu" et un "chemin absolu canonique" pour certains programmes sur votre système si vous utilisez linux ou GNU Coreutils.

Je peux obtenir le chemin de 'java' sur mon système en utilisant which

$ which java
/usr/bin/java

Ce chemin, cependant, est en fait un lien symbolique vers un autre lien symbolique. Cette chaîne de liens symboliques peut être affichée en utilisant namei .

$ namei $(which java)
f: /usr/bin/java
 d /
 d usr
 d bin
 l java -> /etc/alternatives/java
   d /
   d etc
   d alternatives
   l java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
     d /
     d usr
     d lib
     d jvm
     d java-17-openjdk-amd64
     d bin
     - java

Le chemin canonique peut être trouvé à l'aide de la méthode mentionnée précédemment. realpath mando.

$ realpath $(which java)
/usr/lib/jvm/java-17-openjdk-amd64/bin/java

7voto

Cratylus Points 21838

La définition d'un chemin canonique (ou sa différence avec un chemin absolu) dépend du système.
En général, si un chemin (complet) contient des alias, des raccourcis ou des liens symboliques, le chemin canonique les résout tous en répertoires réels auxquels ils font référence.
Exemple : si /bin/a est un lien sym, vous pouvez le trouver partout où vous demandez un chemin absolu, par exemple à partir de java.io.File#getAbsolutePath tandis que le fichier réel (c'est-à-dire la cible réelle du lien), c'est-à-dire usr/local/bin/a serait retourné comme un chemin canonique, par exemple de java.io.File#getCanonicalPath

2voto

La plupart des problèmes avec les chemins canoniques se produisent lorsque vous passez le nom d'un répertoire et non d'un fichier. Pour un fichier, si nous fournissons un chemin absolu, c'est également le chemin canonique. Mais pour un répertoire, cela signifie omettre le dernier "/". Par exemple, "/var/tmp/foo" est un chemin canonique alors que "/var/tmp/foo/" ne l'est pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X