【问题标题】:File id for keeping track of file changes in Java?用于跟踪Java中文件更改的文件ID?
【发布时间】:2012-01-07 13:02:38
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: windows macos java-7 file-attributes


    【解决方案1】:

    我在 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);
    
    
    }
    

    如果此类自定义文件属性适用于所有主要平台,那就太好了,因为此类自定义文件属性在某些情况下非常方便。希望他们这样做。

    【讨论】:

    • 我可以用一个插件解决它,但有趣的是你让它工作了。谢谢,有机会我会试试看的。
    • 在windows中UserDefinedFileAttributeView的存储是怎么做的?
    【解决方案2】:

    这在 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-05-25
      • 2012-06-23
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2014-05-21
      • 2015-11-21
      相关资源
      最近更新 更多