Java7 WatchService - 如何检测实际监视目录的重命名/移动

rje*_*zek 10 java io java-7 watchservice

我正在使用WatchService应用程序工作台的同步数据文件.当我重命名/移动被监视的目录时,我没有得到任何事件,WatchKey也不会变得无效.我仍然从重命名的目录中获取事件,但据我所知,没有办法找出WatchKey的实际路径WatchKey.watchable(),但仍然会返回原始目录路径.我想避免需要锁定监视目录以防止更改,因为我希望尽可能保持应用程序的轻量级.

我在Windows 7上遇到过JDK 7u10的这个问题

您是否知道此问题的任何解决方法而不锁定目录或查看根目录的所有目录?

UPDATE

在Linux上,我观察到了相同的行为.

到目前为止,我现在有三种选择.

1)依靠用户的纪律,他/她不会移动数据目录.我真的不喜欢这个选项,因为它可能会导致未定义的行为.

2)使用更广泛的非标准本机库

3)在高级目录上创建监视程序的层次结构.这些只接受ENTRY_DELETE事件,因为此事件(或OVERFLOW)必须在实际监视目录被移动或删除时出现,因此无效.

Ste*_*n C 6

我的理解是,重命名目录将在旧的和新的父目录上生成文件系统事件,而不是在重命名的目录上.根据Can iNotify的答案,告诉我监控文件的移动位置?,除非您监视目标目录,否则操作系统无法告诉您移动的位置.(此外,在Java 7/8中,MOVE事件不由监视服务实现处理.)

UPDATE

您可以尝试使用标准Java7 API 添加对(特定平台的)扩展事件的支持的jpathwatch项目WatchService.

参考文献: