0

我已经制作了一些代码来检测目录中的更改,C:/my_dir它工作得很好。(我按照这个链接

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

C:/my_dir/*什么想法吗?

4

3 回答 3

2

您正在寻找的是递归。

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

function iteratePath(File root, List<File> registerMe) {
      if (root!= null && root.isDirectory())  {
          registerMe.add(root);
          for (File f : root.listFiles()) {
              iteratePath(f, registerMe);
          }
      }
}
于 2012-04-13T08:27:20.170 回答
2

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

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

如果是前者,可以使用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.javaregisterAll()中的方法。

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

于 2012-04-13T08:52:31.730 回答
1

您可能需要考虑使用Apache Commons IO 库中的FileAlterationMonitor。API 相当容易使用,这里有一些示例

于 2012-04-13T08:54:07.377 回答