使用Java WatchService监控文件夹中的子文件夹

4
我正在尝试使用Java 7中的WatchService来监控文件夹。我希望它能监视任何添加到WatchService注册路径的文件或文件夹。
如果我将一个文件夹添加到注册路径,它会正确地检测到ENTRY_CREATE并返回watchEvent.context()中文件夹的名称。但是,如果我在该文件夹中添加另一个文件夹,则它再次被检测到,但watchEvent.context()返回相同的文件夹和ENTRY_MODIFY,因为该文件夹已通过添加另一个文件夹进行了修改。
所以我理解了这一点,但不知道是否应该注册结构中的每个文件夹,还是只注册顶级文件夹并监听CREATE和MODIFY。

http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java应该很有用,它展示了如何通过遍历FileTree递归地添加WatchKeys。 - Franz Ebner
1个回答

4

跨平台并没有直接支持这一功能。在Windows系统中,有一个ExtendedWatchEventModifier.FILE_TREE可以递归地监控一个目录。但是在Mac或Linux系统中没有相应的功能。另外,请注意ExtendedWatchEventModifier是扩展而非标准定义的一部分。

你需要监听CREATE和DELETE事件。当创建(删除)的对象是一个目录时,你需要在子目录上添加(删除)一个新的监控。


谢谢,你是指这个网站 http://jpathwatch.sourceforge.net/ 吗?看起来现在可能支持OSX了,但对我来说更保险的做法是注册每个文件夹。 - Paul Taylor
我相信这就是WatchService概念的许多起源之一。但它也是OpenJDK7的一部分:http://www.docjar.com/html/api/com/sun/nio/file/ExtendedWatchEventModifier.java.html 请注意,这是一个com.sun.*类。 - Devon_C_Miller
1
我发现自Java 10以来,在jdk.unsupported库中存在ExtendedWatchEventModifier。 - marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接