go fsnotify 监听程序无法捕获 vim 修改后的文件?
遇到的问题
当使用 echo 命令修改文件时,监听函数能够正常检测到文件修改事件并生效,但使用 vim 编辑并保存文件后,监听函数无法检测到修改事件
原因
vim 在保存文件时,通常不会直接修改原始文件,而是通过以下步骤操作:
-
1、创建一个临时文件,写入修改后的内容。
-
2、删除原始文件。
-
3、将临时文件重命名为原始文件名。
这种操作方式可能导致文件监听工具(例如 Go 的 fsnotify 库)无法捕获到预期的写事件
(fsnotify.Write),因为实际发生的事件可能是删除(fsnotify.Remove)或重命名
(fsnotify.Rename),而不是简单的写入。
如何解决
为了支持 vim 的修改行为,需要改进监听函数,使其不仅监听写事件,还能处理删除和重命名事件,并在文件被删除或重命名后重新添加监听。以下是具体步骤和实现:
1、扩展事件监听
除了监听写事件(fsnotify.Write),还需要监听:
-
删除事件(fsnotify.Remove):当原始文件被删除时触发。
-
重命名事件(fsnotify.Rename):当临时文件被重命名为原始文件名时触发。
2、重新添加监听
当检测到文件被删除或重命名时,监听器会丢失对文件的跟踪。因此,需要在事件发生后重新将文件添加到监听器中,确保持续监控。

浙公网安备 33010602011771号