<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Golang 監控文件夾內文件的增刪改(包括子文件夾)

      你需要自己處理log部分

      package main
      
      import (
          "crypto/md5"
          "fmt"
          "go-admin/log"
          "os"
          "path/filepath"
          "time"
      
          "github.com/fsnotify/fsnotify"
      )
      
      type FileChangeCallback func(absfpname string)
      
      type ConfigFileWatcher struct {
          WatchedDirectory string             // 監控目錄
          FileSuffix       string             // 監控的文件類型
          OnFileChange     FileChangeCallback // 相關文件有變更就會調用這個回調
      }
      
      func (cfw ConfigFileWatcher) WatchConfigFileChanges() {
          // 注意如果該文件被其他程序占用的話會讀取不出內容的。比如vscode打開了文件
          getFileHash := func(filename string) (string, error) {
              data, err := os.ReadFile(filename)
              if err != nil {
                  return "", err
              }
              return fmt.Sprintf("%x", md5.Sum(data)), nil
          }
      
          watcher, err := fsnotify.NewWatcher()
          if err != nil {
              log.Fatal("WatchConfigFileChanges", err.Error(), "")
          }
          defer watcher.Close()
      
          dir := cfw.WatchedDirectory
      
          fileInfos := make(map[string]string)
      
          err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
              if err != nil {
                  return err
              }
              if info.IsDir() {
                  err = watcher.Add(path)
                  if err != nil {
                      log.Fatal("WatchConfigFileChanges", err.Error(), "")
                  }
              } else {
                  if filepath.Ext(path) == ".yml" {
                      hash, err := getFileHash(path)
                      if err != nil {
                          log.Fatal("WatchConfigFileChanges", "獲取文件哈希出錯:%s", err.Error())
                      } else {
                          fileInfos[path] = hash
                      }
                  }
      
              }
              return nil
          })
          if err != nil {
              log.Fatal("WatchConfigFileChanges", "%s", err.Error())
      
          }
      
          fmt.Println("開始監控...")
      
          var lastEventTime time.Time
          interval := 500 * time.Millisecond // 設置等待時間為500毫秒
      
          func() {
              for {
                  select {
                  case event, ok := <-watcher.Events:
                      if !ok {
                          return
                      }
                      if (event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create) &&
                          filepath.Ext(event.Name) == cfw.FileSuffix {
      
                          // 檢查時間間隔,如果在等待時間內則跳過
                          if time.Since(lastEventTime) < interval {
                              continue
                          }
      
                          // 獲取文件的最新MD5值
                          newHash, err := getFileHash(event.Name)
                          if err != nil {
                              log.Fatal("WatchConfigFileChanges", "獲取文件哈希出錯:%s", err.Error())
                          } else {
                              // 對比MD5值,確認文件內容是否發生了變化
                              if prevHash, exists := fileInfos[event.Name]; exists && prevHash == newHash {
                                  fmt.Println("文件未更改:", event.Name)
                                  log.Log("WatchConfigFileChanges", "文件未更改:%s", event.Name)
                              } else {
                                  fileInfos[event.Name] = newHash
                                  absPath, _ := filepath.Abs(event.Name)
                                  log.Log("WatchConfigFileChanges", "文件修改或創建:%s", absPath)
                                  cfw.OnFileChange(absPath)
                              }
                          }
      
                          // 更新最后事件時間
                          lastEventTime = time.Now()
      
                          // 因為fsnotify源碼常量定義錯了。Rename和Remove搞反了
                      } else if (event.Op&fsnotify.Rename == fsnotify.Rename) && filepath.Ext(event.Name) == cfw.FileSuffix {
                          // 檢查時間間隔,如果在等待時間內則跳過
                          if time.Since(lastEventTime) < interval {
                              continue
                          }
                          absPath, _ := filepath.Abs(event.Name)
                          fmt.Println("文件被刪除:", absPath)
                          cfw.OnFileChange(absPath)
                          // 更新最后事件時間
                          lastEventTime = time.Now()
                      }
                  case err, ok := <-watcher.Errors:
                      if !ok {
                          return
                      }
                      log.Fatal("WatchConfigFileChanges", "錯誤:%s", err.Error())
                  }
              }
          }()
      
      }

       

      posted @ 2024-01-11 09:06  看一百次夜空里的深藍  閱讀(436)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 大地资源中文在线观看西瓜| 亚洲综合精品香蕉久久网| 夜夜添无码试看一区二区三区 | 俄罗斯美女真人性做爰| 欧美成人精品三级在线观看| 国产色精品久久人妻| 九九成人免费视频| 国产一区二区三区我不卡| 国产丰满老熟女重口对白| 久久人搡人人玩人妻精品| 国产在线乱子伦一区二区| 亚洲 日本 欧洲 欧美 视频| 自拍偷在线精品自拍偷99| 日韩免费视频一一二区| 在线播放亚洲成人av| 中文字幕 日韩 人妻 无码| 一本大道无码av天堂| 18禁无遮挡啪啪无码网站破解版| 日韩亚洲国产激情一区二区| 亚洲日韩一区二区| 三级4级全黄60分钟| 开心五月深深爱天天天操| 女人被狂躁c到高潮| 国产精品十八禁在线观看| 久久无码专区国产精品| 国产精品不卡区一区二| 亚洲av精选一区二区| 天堂网亚洲综合在线| 国产熟女一区二区三区四区| 国产av国片精品一区二区| 女人被狂c躁到高潮视频| 国产一二三四区中| 国产a级三级三级三级| 亚洲色大成网站WWW久久| 亚洲日韩国产二区无码| 久久精产国品一二三产品| 国产成人高清在线重口视频| 亚洲精品一区二区美女| 少妇高潮灌满白浆毛片免费看| 丁香婷婷在线观看| 香蕉eeww99国产在线观看|