在使用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);
            }

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


解决方法:

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

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

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

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

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

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

标签: java, watchservice

相关文章推荐

添加新评论,含*的栏目为必填