使用 fsnotify 包可以轻松实现 golang 中的文件监控,其基于操作系统事件机制(如 linux 的 inotify),性能好且使用简单。1. 安装:通过 go get github.com/fsnotify/fsnotify 安装包;注意系统权限限制可能影响监听数量。2. 创建监听器:初始化 watcher、添加监听路径、启动循环处理事件和错误。3. 支持递归监听子目录:需手动遍历目录结构并逐个添加。4. 注意事项:事件可能重复触发,需做去重判断;跨平台行为略有差异,需测试验证;系统资源限制可能导致监听失败,需适当调整 ulimit 和 inotify 参数;建议对频繁触发事件进行延时合并处理。

Golang 监控文件变化其实并不难,使用标准库之外的
fsnotify

下面我们就来看看怎么用 fsnotify来监控文件变化。
在使用之前,你需要先安装
fsnotify
立即学习“go语言免费学习笔记(深入)”;

go get github.com/fsnotify/fsnotify
这一步很简单,但容易被忽略的是:某些操作系统可能需要额外权限才能监听大量文件或目录,所以如果运行时出现异常,可以检查一下系统限制。
创建一个基本的监听流程大致如下:

示例代码如下:
package main
import (
"log"
"github.com/fsnotify/fsnotify"
)
func main() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
done := make(chan bool)
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
log.Println("事件详情:", event)
if event.Op&fsnotify.Write == fsnotify.Write {
log.Println("文件被写入了:", event.Name)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
log.Println("错误信息:", err)
}
}
}()
// 添加你想要监听的目录或文件
err = watcher.Add("/path/to/watch")
if err != nil {
log.Fatal(err)
}
<-done
}这段代码监听了一个目录下的所有变化,并在控制台打印出事件类型和文件名。你可以根据需要添加多个路径。
默认情况下,
fsnotify
一个简单的做法是:
filepath.Walk
watcher.Add
例如:
filepaths.Walk(rootPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
watcher.Add(path)
}
return nil
})这样就能实现递归监听了。不过要注意的是,目录太多可能会触发系统资源限制,适当调整 ulimit 是有必要的。
CHMOD
/proc/sys/fs/inotify/
基本上就这些。用 fsnotify 实现文件监控不复杂,但细节上还是有些坑需要注意。只要理解它的事件机制和限制,大多数场景都能轻松应对。
以上就是Golang如何监控文件变化 使用fsnotify实现实时监听文件系统的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号