2011-11-27 60 views
0

我試圖找到一種方法來跟蹤文件,即使它們在文件系統中被移動或重命名。用於跟蹤Java中文件更改的文件ID?

我想到的一個想法是在Java 7中使用新的UserDefinedFileAttributeView,並創建一個自定義文件屬性作爲一種自定義ID。我認爲這可能適用於不同的平臺(主要是Windows和Mac)。但我無法讓它工作。即使嘗試此頁上的示例 - http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html - 當我到達此行時:

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

我只爲視圖變量獲取一個空值,然後程序以一個空指針異常停止。

然後我發現至少有一種對Mac來說可能更簡單的方法:使用BasicFileAttributes fileKey屬性。我試過這個,即使我移動文件或重命名文件,fileKey似乎仍然保持不變。然而,它也說這個功能是依賴於平臺的,我記得在某個地方看到它不適用於Windows ...

因此,首先,fileKey方法是在Mac上執行此操作的穩定方法嗎?如果是這樣,我可以爲Windows的相同功能做些什麼?任何人都知道爲什麼我在UserDefinedFileAttributeView上得到空值?因爲如果我能夠實現這個目標,我認爲它應該是跨平臺的。

這不是一個需要超級強大的,可擴展的,它只是我正在開發一個小的輔助應用程序,但它需要移動或重命名時要至少可靠識別文件...

回答

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


} 

這將是巨大的,如果這樣的自定義文件屬性在所有主要平臺的工作,因爲這樣的自定義文件屬性在某些情況下,令人難以置信的方便。希望他們這樣做。

+0

我可以用插件來解決這個問題,但有趣的是,你有這個工作。謝謝,我會在有機會的時候嘗試一下。 – Anders

+0

UserDefinedFileAttributeView如何在Windows中完成存儲? – Shrenik