递归监视java中的目录和所有子目录

时间:2015-07-02 11:24:45

标签: java directory subdirectory jnotify

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

我目前的代码如下

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

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

2 个答案:

答案 0 :(得分:0)

我想鼓励你再试一次。它可以很好地报告子目录中的更改,并且比为要跟踪的每个目录创建WatchKey的负载更加节省资源。

至于您的UnsatisfiedLinkError,请参阅How to set the java.library.path from Eclipse。我将jnotify_64bit.dll(Windows here)放在我项目的基础目录中,并且它有效。 YMMV。

答案 1 :(得分:-1)

从你的问题来看,我认为你的要求是轮询目录,当一些文件出现时,意味着调用一些方法。

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