递归地监视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。它可以很好地报告子目录中的更改,并且看起来比为要跟踪的每个目录创建WatchKeys负载更节省资源。

至于UnsatisfiedLinkError,请参阅如何从Eclipse中设置java.library.path。我把jnotify_64bit.dll(这里是Windows(放在项目的基本目录中,它就工作了。YMMV。

根据您的问题,我假设您的要求是轮询目录,当某个文件到来时,执行一些操作,即调用某个方法。

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

最新更新