11

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

我在 Windows 7 上使用 JDK 7u10 遇到了这个问题

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

更新

在 Linux 上,我观察到了同样的行为。

到目前为止,我现在似乎有三个选择。

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

2)使用更广泛的非标准原生库

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

4

1 回答 1

6

我的理解是重命名目录会在新旧父目录上生成文件系统事件,而不是在重命名的目录上。根据Can iNotify 的答案告诉我受监控的文件被移动到哪里?,除非您正在监视目标目录,否则操作系统无法告诉您某些内容被移动到了哪里。(此外,在 Java 7/8 中 MOVE 事件不由 watch 服务实现处理。)

更新

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

参考:

于 2013-01-13T14:05:30.757 回答