【问题标题】:Recursively monitor a directory and all sub directories in java递归监控java中的一个目录和所有子目录
【发布时间】:2015-09-19 21:43:13
【问题描述】:

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

我目前的代码如下

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

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

【问题讨论】:

标签: java directory subdirectory jnotify


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    至于您的UnsatisfiedLinkError,请参阅How to set the java.library.path from Eclipse。我将jnotify_64bit.dll(此处为Windows)放在我项目的基本目录中,它起作用了。 YMMV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2020-08-19
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多