2013-06-12 193 views
1

我編寫了一個Java程序,該程序監視目錄中的更改。我保存了一個文件列表(String []),並且在每隔x秒我會得到一個新列表,並比較它們以查找哪些文件已被添加以及哪些文件已被刪除。檢查文件是否更改名稱

問題是,如果我重命名一個文件,它將顯示爲刪除具有舊名稱的文件,然後作爲新名稱的文件的添加。

我能做些什麼來跟蹤名稱更改?

編輯:我想找到適用於Java 6的解決方案 代碼:

public void run() { 
    int ok; 
    while(true) { 
     // verify if modified from last check 
     if(modified != file.lastModified()) { 
      Date d = new Date(); 
      list = file.list(); 
      // look for new files 
      for(String x : list) { 
       ok = 0; 
       for(String y : old) { 
        if(x.equals(y)) { 
         ok = 1; 
        } 
       } 
       if(ok == 0) { 
        display.setText(display.getText() + "Created file " + x + " at " + d.toString() + "\n"); 
       } 
      } 
      // looking for old files 
      for(String x : old) { 
       ok = 0; 
       for(String y : list) { 
        if(x.equals(y)) { 
         ok = 1; 
        } 
       } 
       if(ok == 0) { 
        display.setText(display.getText() + "Deleted file " + x + " at " + d.toString() + "\n"); 
       } 
      } 
     } 
     old = file.list(); 
     modified = file.lastModified(); 
     try { 
      Thread.sleep(f * 1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

而且,在這段代碼,如果我想要寫舊=列表(保留最近列表),我在線for(String y : old)處獲得NullPointerException。爲什麼?

+0

你有分享的代碼,所以我們知道你目前是如何完成這個的? –

+0

你是基於文件名嗎?而不是名稱,可能是你可以在文件系統中使用id排序的東西...即使一個文件重命名它的id不會改變... http://stackoverflow.com/questions/8289598/ file-id-for-keeping-track-of-file-changes-in-java – pinkpanther

+1

根據文件數量的不同,你可以對文件的MD5和MD5進行檢查,並持續檢查這些哈希值,以便確定如果文件被刪除或沒有。 – Averroes

回答

1

我不認爲有一種方法可以做到便攜,可靠和高效。

  • 讀取文件內容很昂貴並且可能不可靠。 (例如,它會如果你有相同內容的兩個文件打破。

  • 依賴於文件的時間戳可能是不可靠的。(你可以有相同的時間戳不同的文件。)

  • 我不t認爲WatchService可以檢測在一個目錄中重命名的文件(它可以檢測到重命名或重命名,但不是這種情況...根據this javadoc。)

  • 可靠且有效的方法它(至少在Linux系統上)要麼使用本地Linux監視服務(它支持更多FS事件),要麼使用inode編號a找到本機文件創建時間戳。但是這些都涉及使用本機代碼來進行相關的系統調用。