返回顶部

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、重新添加监听

当检测到文件被删除或重命名时,监听器会丢失对文件的跟踪。因此,需要在事件发生后重新将文件添加到监听器中,确保持续监控。

posted @ 2025-03-04 10:18  十方央丶  阅读(59)  评论(0)    收藏  举报