簡體   English   中英

遞歸監視Java中的目錄和所有子目錄

[英]Recursively monitor a directory and all sub directories in java

我需要監視給定目錄及其所有子目錄的更改(尤其是文件和目錄的添加)。

我當前的代碼如下

Path watchFolder = Paths.get("D:/watch");
    WatchService watchService = FileSystems.getDefault().newWatchService();
    watchFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
            watchFolder.register(watchService, StandardWatchEventKinds.ENTRY_DELETE);
            watchFolder.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);

    boolean valid = true;
    do {
        WatchKey watchKey = watchService.take();

        for (WatchEvent event : watchKey.pollEvents()) {
            WatchEvent.Kind kind = event.kind();
            if (StandardWatchEventKinds.ENTRY_CREATE.equals(kind)) {
                String fileName = event.context().toString();
                System.out.println("File Created:" + fileName);
            }
        }
        valid = watchKey.reset();

    } while (valid);

此代碼只能監視父目錄的更改。 如果我在父目錄中添加目錄,則可以觸發該事件。 但是,如果我在子目錄中添加文件,則無法檢測到。

僅供參考:我也嘗試過JNotify,但它一直說java.lang.UnsatisfiedLinkError: no jnotify_64bit in java.library.path

有沒有比這些更好的解決方案?

我想鼓勵你給闖闖。 與為要跟蹤的每個目錄創建WatchKey的負載相比,它很好地報告了子目錄中的更改,並且看起來更加節省資源。

至於您的UnsatisfiedLinkError ,請參閱如何從Eclipse設置java.library.path 我將jnotify_64bit.dll (此處為Windows)放置在項目的基本目錄中,並且可以正常工作。 YMMV。

從您的問題出發,我假設您的要求是輪詢目錄,並且在某些文件出現時執行某些操作,這意味着調用某種方法。

如果我理解正確,那么您應該嘗試JPoller ,它可以降低復雜性並滿足您的需求。 它還允許您設置輪詢間隔,並提供了一些回調方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM