2012-10-09 91 views
1

我試圖評估當前需要攔截給定目錄及其子目錄中的文件更改的需求。適合我需求的幾個工具是jpathwatch和jnotify。 jpathwatch的工作原理,但不支持遞歸目錄監視。 Jnotify似乎很好地解決了這個限制。對新文件jNotify的奇怪行爲

在評估jnotify時,我觀察到一個奇怪的行爲。這在Linux和Windows中都是一致的。讓我試着用一個例子來解釋。我有以下目錄結構:


C: 
|--> Temp | 
      | --> File | 
        | --> Dir | 
           | --> SubDir 

jNotify配置爲偵聽C:/ Temp/File。現在,如果我在「Dir」或「SubDir」文件夾下放置文件,它將捕獲新創建的事件。但是,在同一時間,提出了三個文件修改事件。當我在「SubDir」文件夾中添加一個新文件Extraction.log時,輸出如下。


created C:/Temp/File/Dir/SubDir/Extraction.log 
modified C:/Temp/File/Dir/SubDir/Extraction.log 
modified C:/Temp/File/Dir/SubDir/Extraction.log 
modified C:/Temp/File/Dir/SubDir/Extraction.log 

正如你所看到的,文件修改有3個事件。該應用程序沒有任何方法來確定其修改或新文件創建。所以,它會處理相同的文件四次。

我使用JNotify網站中顯示的示例代碼。


package com.test.io; 

import net.contentobjects.jnotify.JNotify; 

public class JNotifyTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     JNotifyTest jNotify = new JNotifyTest(); 
     try { 
      jNotify.sample(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private void sample() throws Exception { 
     // path to watch 

     String path = "C:\\Temp\\File\\"; 

     // watch mask, specify events you care about, 
     // or JNotify.FILE_ANY for all events. 
     int mask = JNotify.FILE_CREATED | 
     JNotify.FILE_DELETED | 
     JNotify.FILE_MODIFIED | 
     JNotify.FILE_RENAMED; 

     // watch subtree? 
     boolean watchSubtree = true; 

     // add actual watch 
     int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener()); 

     // sleep a little, the application will exit if you 
     // don't (watching is asynchronous), depending on your 
     // application, this may not be required 
     Thread.sleep(1000000); 

     // to remove watch the watch 
     boolean res = JNotify.removeWatch(watchID); 
     if (!res) { 
      // invalid watch ID specified. 
     } 
    } 

    class Listener implements JNotifyListener { 
     public void fileRenamed(int wd, String rootPath, String oldName, 
       String newName) { 
      System.out.println("renamed " + rootPath + oldName + " -> " + newName); 
     } 
     public void fileModified(int wd, String rootPath, String name) { 
      System.out.println("modified " + rootPath + name); 
     } 
     public void fileDeleted(int wd, String rootPath, String name) { 
      System.out.println("deleted " + rootPath + name); 
     } 
     public void fileCreated(int wd, String rootPath, String name) { 
      System.out.println("created " + rootPath + name); 
     } 
    } 
} 

不幸的是,我不能使用jdk 1.7,因爲我們被困在1.6中。

我見過很多與jNotify相關的帖子,如果有人可以提供指針或任何其他解決方案來解決這個需求,我會非常感激。

感謝

回答

0

這是最有可能不是jNotify問題,但由於方式的OS處理文件的創建。我在Python中看到類似的事情發生在pynofity庫中。您應該在應用程序代碼中處理此問題,例如將觸發處理延遲幾秒鐘,以便可以緩衝任何新事件(如果有),然後僅處理某個類型的最新事件。

+0

感謝您的回覆。正如你所提到的,它可能是一個操作系統的問題,它引發了文件創建或修改的多個事件。但是,我不確定你提出的緩衝解決方案將如何工作,特別是當連續處理多個文件時。 – Shamik