WatchService(Windows 7):删除文件时,它会触发ENTRY_MODIFY和ENTRY_DELETE事件吗?

时间:2015-01-28 19:59:50

标签: java watchservice

在使用WatchService时,我发现如果删除正在监视的目录中的文件,则会触发ENTRY_MODIFY后跟ENTRY_DELETE事件。

我意识到从技术上讲,文件可能会在删除之前被修改,但实际上删除文件的预期行为是否会触发ENTRY_MODIFY(可能没有人关心)?

为了处理这个问题,我必须在传递ENTRY_MODIFY事件之前添加一个要检查的条件:

            if (eventKind == ENTRY_CREATE) {
                listener.fileCreated(file);
            } else if (eventKind == ENTRY_MODIFY) {
                if (Files.exists(fullPath, LinkOption.NOFOLLOW_LINKS)) {
                    listener.fileChanged(file);
                }
            } else if (eventKind == ENTRY_DELETE) {
                listener.fileDeleted(file);
            }

这是否有更好的方法来处理此问题(功能)?

1 个答案:

答案 0 :(得分:1)

我只能确认这个问题。从评论和我自己的观察中,ENTRY_MODIFY事件在文件被删除之前被触发,你必须处理它。

假设我们有两个线程。一个是Files.delete(),另一个是观看目录并尝试读取修改过的文件。可能发生以下任何情况:

  1. Files.delete()只是设法修改和删除文件,然后由观看线程选择事件。然后在ENTRY_MODIFY工作之后检查文件存在的技术。
  2. Files.delete()调用可能失败(返回false),因为该文件已被观看线程打开。
  3. 唯一的解决方案似乎是忽略观看主题中的所有IOExceptions并重试Files.delete()次呼叫几次。

    我只尝试使用Files.delete()从同一JVM中删除文件。我没有尝试从系统上的其他进程中删除。使用NTFS在Windows 7~10上重现问题,可能在其他操作系统上没有。

    我鼓励其他人编辑此答案并添加他们的观察结果。