【发布时间】:2013-01-12 13:28:45
【问题描述】:
我正在使用WatchService 与应用程序工作台同步数据文件。当我重命名/移动监视目录时,我没有收到任何事件,WatchKey 也不会变得无效。我仍然从重命名的目录中获取事件,但据我所知,除了WatchKey.watchable() 之外,没有办法找到 WatchKey 的实际路径,但它仍然返回原始目录路径。我想避免需要锁定监视目录以防止更改,因为我希望使应用程序尽可能轻量级。
我在 Windows 7 上使用 JDK 7u10 时遇到过这个问题
您知道在不锁定目录或查看所有目录到根目录的情况下解决此问题的任何解决方法吗?
更新
在 Linux 上我观察到了同样的行为。
到目前为止,我似乎有三个选择。
1) 依靠用户的纪律,他/她不会移动数据目录。我不太喜欢这个选项,因为它可能会导致未定义的行为。
2) 使用更广泛的非标准原生库
3) 在上级目录上创建看门狗的层次结构。这些将仅接受 ENTRY_DELETE 事件,因为此事件(或 OVERFLOW)必须在实际监视的目录被移动或删除时出现,因此无效。
【问题讨论】:
-
Javadoc 指定这使用了本机可用的机制,您是否尝试并搜索过 Win7 的机制在这种情况下的作用?
-
Windows 上的本机机制使用目录句柄,在重命名/移动目录但发送特定事件时不会更改目录句柄。这不是问题,但在 java 中,我看不到任何检测这些 Windows 特定事件的方法,也看不到任何获取和检查实际目录句柄值的方法。
标签: java io java-7 watchservice