|
@@ -3,6 +3,9 @@ package fsnotify
|
|
|
import (
|
|
|
"fmt"
|
|
|
"log"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "strings"
|
|
|
"time"
|
|
|
|
|
|
"github.com/fsnotify/fsnotify"
|
|
@@ -11,6 +14,60 @@ import (
|
|
|
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()
|
|
@@ -18,34 +75,39 @@ func FSNotifyFUNC(name, dir string, flag bool, f func()) {
|
|
|
watch, err := fsnotify.NewWatcher()
|
|
|
if err != nil {
|
|
|
log.Println("watch new err", err)
|
|
|
+ return
|
|
|
}
|
|
|
defer watch.Close()
|
|
|
- err = watch.Add(dir)
|
|
|
+ log.Println("dir:", dir)
|
|
|
+ err = watch.Add("../tmp")
|
|
|
if err != nil {
|
|
|
log.Println("watch add err", err)
|
|
|
+ return
|
|
|
}
|
|
|
- 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
|
|
|
+ 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()
|
|
|
}
|
|
|
- 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.Error())
|
|
|
- return
|
|
|
+ case err := <-watch.Errors:
|
|
|
+ {
|
|
|
+ log.Println("watch error : ", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }()
|
|
|
}
|