[英]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
有沒有比這些更好的解決方案?
我想鼓勵你給jnotify闖闖。 與為要跟蹤的每個目錄創建WatchKey
的負載相比,它很好地報告了子目錄中的更改,並且看起來更加節省資源。
至於您的UnsatisfiedLinkError
,請參閱如何從Eclipse設置java.library.path 。 我將jnotify_64bit.dll
(此處為Windows)放置在項目的基本目錄中,並且可以正常工作。 YMMV。
從您的問題出發,我假設您的要求是輪詢目錄,並且在某些文件出現時執行某些操作,這意味着調用某種方法。
如果我理解正確,那么您應該嘗試JPoller ,它可以降低復雜性並滿足您的需求。 它還允許您設置輪詢間隔,並提供了一些回調方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.