Golang怎么监听文件变化_Golang如何检测文件被修改或新建事件【实战】

张开发
2026/4/6 1:26:50 15 分钟阅读

分享文章

Golang怎么监听文件变化_Golang如何检测文件被修改或新建事件【实战】
fsnotify 是监听文件变化的唯一实用选择它跨平台封装底层机制避免轮询缺陷需手动递归监听子目录、用位运算判断事件类型并务必关闭 Watcher 防止 fd 泄露。用 fsnotify 监听文件变化最靠谱Go 标准库不提供跨平台文件监听能力fsnotify 是事实标准不是“可选方案”是唯一实用选择。它封装了 inotifyLinux、kqueuemacOS、ReadDirectoryChangesWWindows底层机制省去你自己写 syscall 的麻烦。常见错误是直接用 os.Stat 轮询——CPU 白耗、延迟高、错过瞬时修改。还有人试图用 time.AfterFunc 每秒读一次 ModTime()这在日志轮转、编辑器保存瞬间极易漏事件。实操建议用 go get github.com/fsnotify/fsnotify 安装别自己造轮子监听路径必须存在fsnotify.Watcher 不会自动创建父目录注册监听后务必启动 goroutine 读取 w.Events 和 w.Errors 通道否则事件会阻塞甚至丢失对同一路径重复调用 w.Add() 会 panic加前先检查是否已监听监听子目录要手动递归添加fsnotify 默认不递归这是设计使然不是 bug。你 w.Add(config/) 只监听该目录自身事件比如被 mv 或 chmod不会收到 config/db.yml 的修改通知。立即学习“go语言免费学习笔记深入”真实场景里配置热加载、模板重载、静态资源监控都需要子目录穿透。但 fsnotify 不提供 recursive: true 参数得自己处理。实操建议用 filepath.WalkDir 遍历目录树对每个 IsDir() 为 true 的路径调用 w.Add()注意符号链接默认跳过如需跟随改用 filepath.Walk 并自行判断 os.ModeSymlink新增子目录时仅靠 fsnotify.Create 事件不够——你得在收到该事件后主动 w.Add(新路径)否则后续改动收不到macOS 上对深层嵌套目录100 层可能触发 kqueue 限制需捕获 fsnotify.ErrEventOverflow区分文件修改、重命名和删除的典型误判fsnotify.Event 的 Op 字段是位掩码不是单值枚举。常见错误是写 if e.Op fsnotify.Write结果漏掉 fsnotify.Chmod | fsnotify.Write 这类组合操作。 WisPaper 复旦大学研发的AI学术搜索工具5分钟内筛选1000篇论文

更多文章