浏览代码

feat:监控更新

wangshan 3 年之前
父节点
当前提交
1fc1b8df3a
共有 2 个文件被更改,包括 91 次插入21 次删除
  1. 8 0
      src/qfw/util/fsnotify/README.md
  2. 83 21
      src/qfw/util/fsnotify/fsnotify.go

+ 8 - 0
src/qfw/util/fsnotify/README.md

@@ -1,10 +1,18 @@
 #fsnotify监控文件
 
+## 第一版-wangshan
 #“sword->%s”:应用模块名称;“./test.json”:监控文件位置和名称;“true”:是否初始化;“func()”:逻辑处理;
 
 #fs.FSNotifyFUNC("sword->%s", "./test.json", true, func() {
 #	log.Println("------------")
 #	util.ReadConfig("./test.json", &TC)
 #})
+***
+
+## 20220325更新-wangshan
+#fs.GetNewWatch().WatchDir("./tmp", true, func() {
+#	util.ReadConfig("./tmp/ws.json", &WSConf)
+#	log.Println("name:", WSConf.Name)
+#})
 
 #默认5秒内 重复操作无效!!!

+ 83 - 21
src/qfw/util/fsnotify/fsnotify.go

@@ -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
+				}
 			}
 		}
-	}
+	}()
 }