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

"ファイルエイリアスfooへのパス"は、エイリアスが実際のファイルサイズではなく0になるというレポートのサイズです。私は別名をテストするための回避策を見つけました:JavaはMac OSX上でサイズ0のエイリアス(シンボリックリンク)を報告します。本当のファイルサイズはどのように取得するのですか?

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

EDIT実はこのコードは以下のポスターで指摘したように、動作しません。私はLinuxのシンボリックリンクの例から解決策を試みていましたが、私はファインダのエイリアスとシンボリックリンクが同じではないことに気付きませんでした。

NOT!これが動作しているようですが、....

file.getCanonicalFile().length(); 

はまだ誰もが正しい方向に私を指す0にファイルの長さを報告しますか?

答えて

0

サイズ=新しいファイル(file.getCanonicalPath())。length();

+0

私は、これはfile.getCanonicalFile(同じだろうと考えている)。長さ それはまだ0 –

2

ファインダエイリアスは、通常のシンボリックリンクとは異なる獣です。 OS Xの* nixツールは、リソースフォークに格納されているため、エイリアスを認識しません。あなたがosxutilsをインストールする場合は、エイリアスのターゲットを取得するには、このシェルコマンドを使用することができます。

hfsdata -e the-alias 

Javaから、私はRuntime.exec(...)を呼び出すよりも、この他を行うためのより良い方法を知りません。

また、エイリアスを検出するための機能は動作しません。 AFAICT、JavaはFinderエイリアスを認識していません。 が実際にの場合は、osxutilsのようなものを使用するか、プラットフォーム固有のコードを使用してリソースフォーク(おそらくJNIを含む)を読み込む必要があります。どちらのオプションもきれいです。

JNIルートに行く場合は、Alias Manager Referenceのドキュメントをご覧ください。関連する機能はFSIsAliasFileFSResolveAliasFileです。

+0

おかげで、あなたが行き止まりを追いかけて私にいくつかの時間を保存返します。すばらしい応答時間! –

1

O'Reilly Java NIO APIのFileRefインターフェイスを使用できます。私はあなたが望むようにgetAttribute()メソッドがシンボリックリンクを処理できると信じていますが、私はMac OSXでそれを試していません。 docsから:

オプションの配列は に使用することができる ファイルが シンボリックリンクである場合のためにどのように扱われるかシンボリックリンクを示しています。デフォルトでは、記号 リンクが続き、 リンクの最終ターゲットのファイル の属性が読み取られます。 NOFOLLOW_LINKSオプションが存在する場合は、 シンボリックリンクに従わないので、 メソッドはシンボリックリンクのファイル属性 を返します。

関連する問題