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

wobei "Pfad zum Dateialias foo" eine Alias-Berichtsdateigröße von 0 anstatt der tatsächlichen Dateigröße ist. Ich fand eine Lösung für Aliase zu testen:Java meldet Alias ​​(Symlink) als Größe 0 unter Mac OSX. Wie bekomme ich die wahre Dateigröße?

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

EDIT Eigentlich ist dieser Code nicht funktioniert, wie unten durch ein Plakat aufgezeigt. Ich habe versucht, eine Lösung von einem Linux Symlink Beispiel anzupassen, aber ich habe nicht erkannt, dass Finder Aliase und Symlinks nicht die gleichen waren.

NICHT! dies scheint zu funktionieren, aber ....

file.getCanonicalFile().length(); 

noch Dateilänge berichtet 0. sein jemand mich in die richtige Richtung zeigen kann?

Antwort

0

size = neue Datei (file.getCanonicalPath()). Length();

+0

Ich glaube, das ist das gleiche wie file.getCanonicalFile würde(). Länge es gibt immer noch 0. –

2

Finder-Aliase sind ein ganz anderes Biest als normale symbolische Links. Die * nix-Tools unter OS X kennen überhaupt keine Aliase, weil sie, glaube ich, in der Resource Fork gespeichert sind. Wenn Sie osxutils installieren, können Sie diesen Shell-Befehl verwenden, um das Ziel eines Alias ​​zu erhalten:

hfsdata -e the-alias 

Von Java, weiß ich nicht, einen besseren Weg, diese andere zu tun als Runtime.exec(...) aufrufe.

Auch ich habe nur eine kurze Überprüfung, und Ihre Funktion zum Erkennen von Aliasen funktioniert nicht. AFAICT, Java kennt Finder-Aliase nicht. Wenn Sie wirklich wollen, um sie zu unterstützen, dann müssen Sie entweder etwas wie osxutils verwenden, oder verwenden Sie einige plattformspezifische Code zum Lesen von Ressourcen Gabeln (wird wahrscheinlich JNI). Keine der beiden Optionen ist hübsch.

Wenn Sie die JNI-Route gehen, überprüfen Sie die Alias Manager Reference Dokumentation. Die relevanten Funktionen sind FSIsAliasFile und FSResolveAliasFile.

+0

Danke, gespeichert Sie mir etwas Zeit jagen Sackgassen. Unglaubliche Reaktionszeit! –

1

Sie können die FileRef Schnittstelle von der O'Reilly Java NIO API verwenden. Ich glaube, dass die getAttribute() -Methode mit symbolischen Links umgehen kann, wie Sie wollen, aber ich habe es nicht auf Mac OSX versucht. Vom docs:

Die Optionen Array verwendet werden können angeben, wie symbolische Links sind für den Fall behandelt, dass die Datei ein symbolischer Link ist. Standardmäßig werden symbolische Links verfolgt und das Attribut des endgültigen Ziels der -Verknüpfung wird gelesen. Wenn die Option NOFOLLOW_LINKS vorhanden ist, dann werden symbolische Verknüpfungen nicht befolgt und die Methode gibt das Dateiattribut der symbolischen Verbindung zurück.

Verwandte Themen