即使在文件系统中移动或重命名文件,我也试图找到跟踪文件的方法。
我的一个想法是在Java 7中使用新的UserDefinedFileAttributeView并创建自定义文件属性作为一种自定义ID。我认为这可能适用于不同的平台(主要是Windows和Mac)。但我无法让它发挥作用。即使在这个页面上尝试这个例子 - http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html - 当我到达这一行时:
UserDefinedFileAttributeView view = Files.getFileAttributeView(file,UserDefinedFileAttributeView.class);
我只获取视图变量的空值,然后程序因null引脚异常而停止。
然后我发现至少有一种更简单的方法可以为Mac执行此操作:使用BasicFileAttributes fileKey属性。我试过这个,即使我移动文件或重命名文件,fileKey似乎保持不变。但是,它还说这个功能是依赖于平台的,我记得在某处读过它在Windows上不起作用......
首先,fileKey方法是一种在Mac上执行此操作的稳定方法吗?如果是这样,我可以为Windows的相同功能做些什么?任何人都知道为什么我在UserDefinedFileAttributeView上得到null?因为如果我可以让它工作,那我应该是跨平台的。
这不是一个需要超级健壮和可扩展的东西,它只是我正在开发的一个小帮助应用程序,但它在移动或重命名时识别文件至少需要可靠...
答案 0 :(得分: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);
}
如果这样的自定义文件属性适用于所有主要平台,那将是很好的,因为这样的自定义文件属性在某些情况下非常方便。希望他们这样做。
答案 1 :(得分:0)
这不是在OSX版本的Java上实现的。此错误仍处于打开状态:https://bugs.openjdk.java.net/browse/JDK-8030048
此错误已关闭https://bugs.openjdk.java.net/browse/JDK-8040830,并提及使用第三方解决方法(我还没有尝试过):https://github.com/IsNull/xattrj