Maison >Java >javaDidacticiel >La comparaison de `getAbsolutePath()` et `getCanonicalPath()` est-elle un moyen fiable de déterminer si un répertoire en Java 1.6 est un lien symbolique ?

La comparaison de `getAbsolutePath()` et `getCanonicalPath()` est-elle un moyen fiable de déterminer si un répertoire en Java 1.6 est un lien symbolique ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 14:07:29841parcourir

Is comparing `getAbsolutePath()` and `getCanonicalPath()` a reliable way to determine if a directory in Java 1.6 is a symbolic link?

Détermination des liens symboliques en Java 1.6

Dans un programme Java fonctionnant sur les systèmes Unix, la distinction entre les répertoires réels et les liens symboliques est essentielle. Cette question explore une méthode d'identification des liens symboliques vers des répertoires à l'aide d'une condition spécifique.

Question :

Dans le contexte d'une classe DirectoryWalker, l'approche suivante peut-elle être utilisée pour déterminer avec précision si une instance d'annuaire connue représente un lien symbolique :

<code class="java">if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
    // real directory ---> do normal stuff      
}
else {
    // possible symbolic link ---> do link stuff
}</code>

Réponse :

Bien que l'approche proposée soit une technique courante pour identifier d'éventuels liens symboliques, il ne peut pas être considéré comme fiable pour les raisons suivantes :

  • Faux positifs potentiels : Une inadéquation entre les chemins absolus et canoniques peut se produire même pour les répertoires réels, tels que les lecteurs réseau montés.
  • Dépendance de la plate-forme :Le comportement des chemins de fichiers peut varier selon les différents systèmes d'exploitation et systèmes de fichiers.

Au lieu de s'appuyer sur les chemins absolus et canoniques du fichier lui-même, il est recommandé d’utiliser le chemin canonique du répertoire parent. Cette approche est plus précise pour identifier les liens symboliques.

Voici un exemple d'Apache Commons qui implémente cette technique :

<code class="java">public static boolean isSymlink(File file) throws IOException {
  if (file == null)
    throw new NullPointerException(&quot;File must not be null&quot;);
  File canon;
  if (file.getParent() == null) {
    canon = file;
  } else {
    File canonDir = file.getParentFile().getCanonicalFile();
    canon = new File(canonDir, file.getName());
  }
  return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn