123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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
- }
- }
- }
- }()
- }
|