1
File file = new File("path to file alias foo");

ここで、「path to file alias foo」はエイリアスであり、実際のファイル サイズではなく、ファイル サイズが 0 であると報告されます。エイリアスをテストするための回避策を見つけました:

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

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

いいえ!これはうまくいくようですが....

file.getCanonicalFile().length();

まだファイル長が 0 であると報告されています。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

2

ファインダー エイリアスは、通常のシンボリック リンクとはまったく別物です。OS X の *nix ツールはエイリアスをまったく認識しません。エイリアスはリソース フォークに格納されているからだと思います。をインストールするosxutilsと、次のシェル コマンドを使用してエイリアスのターゲットを取得できます。

hfsdata -e the-alias

Java から、 を呼び出す以外にこれを行うより良い方法を知りませんRuntime.exec(...)

また、簡単なチェックを行ったところ、エイリアスを検出する機能が機能しません。AFAICT、Java は Finder エイリアスを認識していません。本当にそれらをサポートしたい場合は、 のようなものを使用osxutilsするか、プラットフォーム固有のコードを使用してリソース フォークを読み取る必要があります (おそらく JNI が必要です)。どちらのオプションもきれいではありません。

JNI ルートを使用する場合は、Alias Manager Referenceドキュメントを参照してください。関連する機能はFSIsAliasFileFSResolveAliasFileです。

于 2009-06-07T16:49:59.583 に答える
1

O'Reilly Java NIO APIからFileRefインターフェイスを使用できます。getAttribute() メソッドでシンボリック リンクを処理できると思いますが、Mac OSX では試していません。ドキュメントから:

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

于 2009-06-07T16:56:57.063 に答える
0

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

于 2009-06-07T16:44:24.427 に答える