我正在使用
WatchService
与应用程序工作台的同步数据文件.当我重命名/移动被监视的目录时,我没有收到任何事件,也不会使WatchKey无效.我仍然从重命名的目录中获取事件,但据我所知,除了
WatchKey.watchable()
之外,还没有找到WatchKey的实际路径,但是仍然返回原始目录路径.我想避免将观察目录锁定在更改之上,因为我希望保持应用程序尽可能轻松.
我在Windows 7上遇到了JDK 7u10的这个问题
您是否知道有关此问题的任何解决方法,而不锁定目录或将所有目录看到根目录?
UPDATE
在Linux上我观察到同样的行为.
到目前为止,我现在有三个选择.
1)依靠用户的纪律,他/她不会移动数据目录.我不太喜欢这个选项,因为它可能会导致未定义的行为.
2)使用更广泛的非标本地库
3)在上级目录上创建看门狗的层次结构.这些只会接受ENTRY_DELETE事件,因为此事件(或OVERFLOW)必须在实际监视的目录被移动或删除,因此无效时出现.
解决方法
我的理解是,重命名目录将在旧的和新的父目录上生成文件系统事件,而不是重命名的目录.根据
Can iNotify tell me where a monitored file is moved?的答案,操作系统无法告诉您移动到何处,除非您正在监视目标目录. (此外,在Java 7/8 MOVE事件不由手表服务实现处理.)
UPDATE
您可以尝试使用标准Java7 WatchService API添加对(platform specific)扩展事件的支持的jpathwatch项目.
参考文献:
>文档 – http://jpathwatch.wordpress.com/
> javadoc – http://jpathwatch.sourceforge.net/