44 votes

Java 1.6 - déterminer les liens symboliques

Dans une classe DirectoryWalker, je veux savoir si une instance de fichier est en fait un lien symbolique vers un répertoire (en supposant que le randonneur marche sur les systèmes UNIX). Étant donné que je sais déjà que l’instance est un répertoire, la condition suivante serait-elle une condition fiable pour déterminer le lien symbolique?

 File file;
// ...  	
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
    // real directory ---> do normal stuff      
}
else {
    // possible symbolic link ---> do link stuff
}
 

49voto

erickson Points 127945

La technique utilisée dans Apache Commons utilise les canonique chemin d'accès au répertoire parent, et non le fichier lui-même. Je ne pense pas que vous pouvez garantir qu'un décalage est dû à un lien symbolique, mais c'est une bonne indication que le fichier a besoin de soins spéciaux.

C'est Apache code (sous réserve de leur licence), modifié pour la compacité.

public static boolean isSymlink(File file) throws IOException {
  if (file == null)
    throw new NullPointerException("File must not be null");
  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());
}

15voto

Esko Luontola Points 53877

La version 1.6 de Java ne fournit pas de tels accès de bas niveau du système de fichiers. Ressemble NIO 2, qui devrait être inclus dans Java 1.7, aura le soutien pour les liens symboliques. Un projet de la nouvelle API est disponible. Les liens symboliques y sont mentionnées, la création et la suite est possible. Je ne suis pas sûr que la méthode qui devrait être utilisée pour savoir si un fichier est un lien symbolique. Il y a une liste de diffusion pour discuter de NIO 2 - peut-être qu'ils le savent.

14voto

Rob Oxspring Points 1457

Surveillez également les résultats file.isFile() et file.isDirectory() basés sur le fichier résolu, et donc renvoyant false lorsque file réfère à un lien symbolique où la cible n'existe pas.

(Je sais que ce n'est pas une réponse utile en soi mais cela m'a fait trébucher une ou deux fois alors j'ai pensé que je devrais partager)

5voto

Michael Myers Points 82361

Il ressemble getCanonicalPath() pouvez faire d'autres choses qui peuvent faire qu'il est différent du chemin d'accès absolu.

Cette méthode convertit tout d'abord ce nom de chemin absolu de la forme si nécessaire, comme si, en invoquant la getAbsolutePath() la méthode, et puis des cartes à sa forme unique dans un système-dépendant. Généralement, cela consiste à enlever redondante des noms tels que "." et ".." du chemin, de la résolution des liens symboliques (sur les plateformes UNIX), et la conversion des lettres de lecteur à un cas standard (sur les plateformes Microsoft Windows).

Mais il pourrait travailler pour la grande majorité des cas d'utilisation; votre kilométrage peut varier.

3voto

Robert Pappas Points 262

Si vous codez déjà quelque chose spécifiquement pour * nix, vous pouvez alors exécuter une commande shell à partir de Java comme ceci:

 Process p = Runtime.getRuntime().exec(new String[]{"test", "-h", yourFileName});
p.waitFor();
if (p.exitValue() == 0) 
   System.out.println("This file is a symbolic link");
else
   System.out.println("This file is not a symbolic link");
 

C'est très spécifique à * nix, mais ça marche au moins.

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