0

我正在尝试找到一种方法来跟踪文件,即使它们在文件系统中被移动或重命名。

我的一个想法是在 Java 7 中使用新的 UserDefinedFileAttributeView 并创建一个自定义文件属性作为一种自定义 ID。我认为这可能适用于不同的平台(主要是 Windows 和 Mac)。但我无法让它工作。即使尝试此页面上的示例,当我到达这一行时:

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

我只得到视图变量的空值,然后程序因空指针异常而停止。

然后我发现至少对于 Mac 来说有一种更简单的方法可以做到这一点:使用 BasicFileAttributes fileKey 属性。我试过了,即使我移动文件或重命名它,fileKey 似乎也保持不变。然而,它也说这个功能依赖于平台,我记得在某处读到它在 Windows 上不起作用......

那么首先,fileKey 方法是在 Mac 上执行此操作的稳定方法吗?如果是这样,我可以为 Windows 的相同功能做些什么?任何人都知道为什么我在 UserDefinedFileAttributeView 上得到空值?因为如果我能让它工作,我猜它应该是跨平台的。

这不是需要超级健壮和可扩展的东西,它只是我正在开发的一个小帮助应用程序,但它至少需要在移动或重命名时识别文件时可靠......

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);

为了确保属性不只是从视图中读取,我还使用第二个视图运行了相同的代码。这也有效...

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 回答
0

这在 Java 的 OSX 版本上没有实现。此错误仍然存​​在:https ://bugs.openjdk.java.net/browse/JDK-8030048

此错误已关闭,https://bugs.openjdk.java.net/browse/JDK-8040830参考使用第 3 方解决方法(我没有尝试过):https ://github.com/IsNull /xattrj

于 2015-03-17T16:13:58.473 回答