package core import ( "fmt" "os" "path/filepath" "scagent/config" "scagent/util" "github.com/fsnotify/fsnotify" "go.uber.org/zap" ) // 文件变动监控 func FileMonitor() { // 日志 logger := util.NewProductionLogger() defer logger.Sync() // 确保监控目录存在 if err := ensureDirExists(config.G.FilePath); err != nil { logger.Error("无法确保监控目录存在", zap.Error(err)) } // 创建监控器 watcher, err := fsnotify.NewWatcher() if err != nil { logger.Error("无法创建监控器", zap.Error(err)) } defer watcher.Close() // 添加要监控的目录及其子目录 if err := addDirsToWatcher(watcher, config.G.FilePath); err != nil { logger.Error("无法添加目录到监控器", zap.Error(err)) } // 启动事件处理循环 done := make(chan bool) go func() { for { select { case event, ok := <-watcher.Events: if !ok { return } // 处理事件 eventType := getEventType(event) msg := fmt.Sprintf("检测到变化: %s %s", eventType, event.Name) logger.Info(msg) // 发送信息到客服 // 如果是新目录,添加到监控器 if event.Op&fsnotify.Create == fsnotify.Create { if fi, err := os.Stat(event.Name); err == nil && fi.IsDir() { // log.Printf("添加新目录到监控: %s", event.Name) msg := fmt.Sprintf("添加新目录到监控: %s", event.Name) logger.Info(msg) // 发送到客户端 addDirsToWatcher(watcher, event.Name) } } case err, ok := <-watcher.Errors: if !ok { return } logger.Error("监控错误", zap.Error(err)) } } }() // 打印监控目录 logger.Info("监控目录", zap.String("dir", config.G.FilePath)) <-done } // 确保目录存在,如果不存在则创建 func ensureDirExists(dir string) error { if _, err := os.Stat(dir); os.IsNotExist(err) { return os.MkdirAll(dir, 0755) } return nil } // 将目录及其子目录添加到监控器 func addDirsToWatcher(watcher *fsnotify.Watcher, dir string) error { return filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { if err != nil { return err } if d.IsDir() { return watcher.Add(path) } return nil }) } // 获取事件类型描述 func getEventType(event fsnotify.Event) string { switch { case event.Op&fsnotify.Create == fsnotify.Create: return "创建了" case event.Op&fsnotify.Write == fsnotify.Write: return "修改了" case event.Op&fsnotify.Remove == fsnotify.Remove: return "删除了" case event.Op&fsnotify.Rename == fsnotify.Rename: return "重命名了" case event.Op&fsnotify.Chmod == fsnotify.Chmod: return "修改了权限" default: return "发生了变化" } }