package fsnotify import ( "fmt" "log" "os" "path/filepath" "strings" "time" "github.com/fsnotify/fsnotify" ) var applyAction = map[string]int64{} var applyTime int64 = 5 type Watch struct { watch *fsnotify.Watcher } // func GetNewWatch() *Watch { watch, _ := fsnotify.NewWatcher() return &Watch{ watch: watch, } } // func (w *Watch) WatchDir(dir string, b bool, f func()) { go func(b bool) { if b { f() } }(b) filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { //判断是否为目录,只监控目录 if info.IsDir() { path, err := filepath.Abs(path) if err != nil { return err } err = w.watch.Add(path) if err != nil { return err } fmt.Println("监控:", path) } return nil }) go func() { for { select { case ev := <-w.watch.Events: { if strings.HasSuffix(ev.Name, ".json") && ev.Op&fsnotify.Write == fsnotify.Write { go f() } } case err := <-w.watch.Errors: { fmt.Println("error:", err) return } } } }() } // func FSNotifyFUNC(name, dir string, flag bool, f func()) { if flag { f() } watch, err := fsnotify.NewWatcher() if err != nil { log.Println("watch new err", err) return } defer watch.Close() log.Println("dir:", dir) err = watch.Add("../tmp") if err != nil { log.Println("watch add err", err) return } go func() { for { select { case ev := <-watch.Events: { if ev.Op&fsnotify.Write == fsnotify.Write { now := time.Now().Unix() //5秒之内 同一个文件不作操作 if applyAction[fmt.Sprintf(name, ev.Name)] != 0 && now-applyAction[fmt.Sprintf(name, ev.Name)] < applyTime { continue } log.Println("修改文件 : ", fmt.Sprintf(name, ev.Name)) applyAction[fmt.Sprintf(name, ev.Name)] = now time.Sleep(1 * time.Second) //更新应用版本号 f() } } case err := <-watch.Errors: { log.Println("watch error : ", err) return } } } }() }