2009-06-07 7 views
1
File file = new File("path to file alias foo"); 

où « chemin du fichier alias foo » est un rapport d'alias taille fichier à 0 au lieu de la taille réelle du fichier. J'ai trouvé une solution de contournement pour tester les alias:Java rapporte alias (lien symbolique) comme taille 0 sur Mac OSX. Comment puis-je obtenir la taille réelle du fichier?

public boolean isLink() { 
     try { 
      if (file.getAbsolutePath().equals(file.getCanonicalPath())) { 
       return false; 
      } 
     } catch (IOException ex) { 
      logger.severe(ex.getMessage()); 
     } 
     return true; 
    } 

EDIT En fait, ce code ne fonctionne pas, comme l'a souligné une affiche ci-dessous. J'essayais d'adapter une solution à partir d'un exemple de lien symbolique linux, mais je ne me suis pas rendu compte que les alias de finder et les liens symboliques n'étaient pas identiques.

PAS! cela semble fonctionner, mais ....

file.getCanonicalFile().length(); 

rapports encore la longueur du fichier à 0. Quelqu'un peut-il me diriger dans la bonne direction? .

Répondre

0

size = new File (file.getCanonicalPath()) de la longueur();

+0

Je crois que ce serait la même chose que file.getCanonicalFile() longueur. retourne toujours 0. –

2

alias du Finder sont une bête tout à fait différent de liens symboliques normales. Les outils * nix sur OS X ne sont pas du tout au courant des alias, car ils sont stockés dans la fourchette de ressources, je crois. Si vous installez osxutils, vous pouvez utiliser cette commande shell pour obtenir la cible d'un alias:

hfsdata -e the-alias 

de Java, je ne sais pas d'une meilleure façon de faire cette autre que d'appeler Runtime.exec(...).

Aussi, je juste fait une vérification rapide, et votre fonction de détection des alias ne fonctionne pas. AFAICT, Java n'est pas au courant des alias Finder. Si vous voulez vraiment les supporter, alors vous devrez soit utiliser quelque chose comme osxutils, ou utiliser un code spécifique à la plateforme pour lire les liens de ressources (impliquera probablement JNI). Aucune des deux options n'est jolie.

Si vous allez la route JNI, consultez la documentation Alias Manager Reference. Les fonctions pertinentes sont FSIsAliasFile et FSResolveAliasFile.

+0

Merci, tu me as sauvé un certain temps à courir après des impasses. Temps de réponse incroyable! –

1

Vous pouvez utiliser l'interface FileRef de l'API O'Reilly Java NIO. Je crois que la méthode getAttribute() peut gérer les liens symboliques comme vous voulez, mais je ne l'ai pas essayé sur Mac OSX. De l'docs:

Le tableau d'options peut être utilisé pour indiquer liens symboliques sont traitées pour le cas où le fichier est un lien symbolique. Par défaut, les liens symboliques sont suivis et l'attribut du fichier de la cible finale du lien est lu. Si l'option NOFOLLOW_LINKS est présente, alors les liens symboliques ne sont pas suivis et donc la méthode renvoie l'attribut de fichier du lien symbolique.

Questions connexes