0

ファイル システムでファイルが移動または名前変更された場合でも、ファイルを追跡する方法を見つけようとしています。

私が持っていた 1 つのアイデアは、Java 7 で新しい UserDefinedFileAttributeView を使用し、カスタム ファイル属性を一種のカスタム ID として作成することでした。これはさまざまなプラットフォーム (主に Windows と Mac) で動作する可能性があると考えました。しかし、私はそれを機能させることができません。このページの例を試しても、この行に到達すると:

UserDefinedFileAttributeView view = Files.getFileAttributeView(file, UserDefinedFileAttributeView.class);

ビュー変数の null 値のみを取得すると、プログラムは nullpointer 例外で停止します。

次に、少なくとも Mac でこれを行うためのおそらくより簡単な方法があることを発見しました。それは、BasicFileAttributes fileKey 属性を使用することです。これを試してみたところ、ファイルを移動したり名前を変更したりしても、fileKeyは同じままのようです。ただし、この機能はプラットフォームに依存するとも書かれており、Windowsでは機能しないことをどこかで読んだことを覚えています...

まず第一に、fileKey メソッドは Mac でこれを行うための安定した方法ですか? その場合、Windows で同じ機能を使用するにはどうすればよいですか? UserDefinedFileAttributeView で null になる理由を知っている人はいますか? それを機能させることができれば、クロスプラットフォームになるはずだからです。

これは、非常に堅牢でスケーラブルである必要があるものではありません。私が開発している小さなヘルパー アプリケーションにすぎませんが、移動または名前変更されたときにファイルを識別する際に少なくとも信頼できる必要があります...

4

2 に答える 2

0

Windows XP コンピュータで Oracle の例を試しました。コード例には非常に小さなバグがありましたが、それ以外は、コードは正常に動作しました (少なくとも Windows XP では)。Linux などでも動作することを願っていますが、個人的には Windows XP でしか試していません。

public static void main(String args[])
        throws Exception
{
    Path target = Paths.get("C:\\mytemp\\Something.txt");
    Files.createFile(target);
    UserDefinedFileAttributeView view = Files.getFileAttributeView(target, UserDefinedFileAttributeView.class);
    view.write("user.mimetype", Charset.defaultCharset().encode("text/html"));
    String name = "user.mimetype";
    ByteBuffer buf = ByteBuffer.allocate(view.size(name));
    view.read(name, buf);
    buf.flip();
    String value = Charset.defaultCharset().decode(buf).toString();
    System.out.println("value="+value);

属性がビューから読み取られただけではないことを確認するために、2 番目のビューを使用して同じコードも実行しました。これも機能しました...

public static void main(String args[])
        throws Exception
{
    Path target = Paths.get("C:\\mytemp\\SomethingDifferent.txt");
    Files.createFile(target);
    UserDefinedFileAttributeView view = Files.getFileAttributeView(target, UserDefinedFileAttributeView.class);
    view.write("user.mimetype", Charset.defaultCharset().encode("text/html"));
    String name = "user.mimetype";

    UserDefinedFileAttributeView view2 = Files.getFileAttributeView(target, UserDefinedFileAttributeView.class);
    ByteBuffer buf = ByteBuffer.allocate(view2.size(name));
    view2.read(name, buf);
    buf.flip();
    String value = Charset.defaultCharset().decode(buf).toString();
    System.out.println("value="+value);


}

このようなカスタム ファイル属性は状況によっては非常に便利なので、そのようなカスタム ファイル属性がすべての主要なプラットフォームで機能する場合は素晴らしいことです。彼らがそうすることを願っています。

于 2011-12-09T23:29:36.723 に答える