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

Sam*_*erg 5 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);
            }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理这个问题(功能)?

Oli*_*liv 2

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

假设我们有两个线程。一个正在执行Files.delete(),另一个正在监视目录并尝试读取修改后的文件。以下任一情况都可能发生:

  1. Files.delete()只是在事件被监视线程拾取之前设法修改和删除文件。然后在工作后检查文件是否存在的技术ENTRY_MODIFY
  2. 调用Files.delete()可能会失败(返回false),因为文件已被监视线程打开。

唯一的解决方案似乎是忽略IOExceptions监视线程中的所有内容并重试Files.delete()几次调用。

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

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