今天在测试监听文件修改自动更新缓存数据这一功能时偶然发现 StandardWatchEventKinds.ENTRY_MODIFY 竟然会多次触发。刚开始还以为是重载代码中涉及到文件的二次保存,后来 Debug 了一波发现不是,又想了想,要真是套娃不久直接 OOM 了嘛,那就只有一种可能,是编辑器保存修改这个操作本身就涉及到两次对文件内容的更新,查看官方 doc,注释如下:
这里面有句话很耐人寻味
The event count for this event is 1 or greater.
很明显,官方已经预料到这个事件会被重复触发,结合先前分析的编辑器修改前提,通过检索我们可以得知:
通过编辑器编辑文件的内容时,它将同时修改日期(或其他元数据)和内容。因此监听ENTRY_MODIFY时,您将获得两个事件。
不难猜测,如果改用 IO 对文件内容进行修改,ENTRY_MODIFY 仅触发一次。进行验证发现推测正确(具体代码不再贴出)。
最后,对原有监听代码进行去噪处理,其实只需要维护一个标记变量不断取反即可: