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