我已经制作了一些代码来检测目录中的更改,C:/my_dir
它工作得很好。(我按照这个链接)
但我也需要观察者检测所有子目录中的变化。
有C:/my_dir/*
什么想法吗?
您正在寻找的是递归。
您需要遍历目录中的每个子目录...伪代码:
function iteratePath(File root, List<File> registerMe) {
if (root!= null && root.isDirectory()) {
registerMe.add(root);
for (File f : root.listFiles()) {
iteratePath(f, registerMe);
}
}
}
使用 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()
中的方法。
不要忘记,如果稍后出现新的子目录,您可能还想为此添加一个观察者。
您可能需要考虑使用Apache Commons IO 库中的FileAlterationMonitor。API 相当容易使用,这里有一些示例。