监视目录和子目录已更改

时间:2012-04-13 08:17:47

标签: java

我已经在目录C:/my_dir中更改了一些检测代码,但它运行得很好。 (I follow this link

但是我需要观察者也检测到所有子目录中的变化。

喜欢C:/my_dir/*有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你要找的是递归。

您需要遍历目录中的每个子目录...伪代码:

function iteratePath(File root, List<File> registerMe) {
      if (root!= null && root.isDirectory())  {
          registerMe.add(root);
          for (File f : root.listFiles()) {
              iteratePath(f, registerMe);
          }
      }
}

答案 1 :(得分:2)

使用Watch Service API,您必须为每个子目录注册一个单独的监视。

我不确定您是只想查看根目录的子目录,还是只查看根目录下的整个目录树。

如果是前者,可以使用Files.newDirectoryStream()遍历目录的子目录:

for (Path subDir : Files.newDirectoryStream(rootPath,
        new DirectoryStream.Filter<Path>() {
            @Override
            public boolean accept(Path entry) throws IOException {
                return Files.isDirectory(entry);
            }
        }) {
    // add watcher
}

如果是后者,那么您可以使用Files.walkFileTree()方法。实际上,这就是他们在您链接的示例中所做的事情。请查看WatchDir.java中的registerAll()方法。

不要忘记,如果稍后出现一个新的子目录,您可能还想为此添加一个观察者。

答案 2 :(得分:1)

您可能需要考虑使用Apache Commons IO库中的FileAlterationMonitor。 API非常易于使用,并且有一些示例here