0

我需要监视给定目录及其所有子目录的更改(特别是添加文件和目录)。

我当前的代码如下

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

还有比这些更好的解决方案吗?

4

2 回答 2

0

我想鼓励你再试一次WatchKey它很好地报告了子目录中的变化,并且看起来比为您要跟踪的每个目录创建负载更资源效率。

至于您的UnsatisfiedLinkError,请参阅如何从 Eclipse 中设置 java.library.path。我将jnotify_64bit.dll(Windows here)放在我项目的基本目录中,并且它起作用了。YMMV。

于 2015-07-08T09:15:54.360 回答
-1

根据您的问题,我假设您的要求是轮询目录,并且当某个文件来做某事时,这意味着调用某个方法。

如果我理解正确,那么您应该尝试JPoller,它可以降低复杂性并满足您的需求。它还允许您设置轮询间隔并为您提供一些回调方法。

于 2015-07-02T11:32:30.657 回答