fsnotify.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package fsnotify
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "time"
  9. "github.com/fsnotify/fsnotify"
  10. )
  11. var applyAction = map[string]int64{}
  12. var applyTime int64 = 5
  13. type Watch struct {
  14. watch *fsnotify.Watcher
  15. }
  16. //
  17. func GetNewWatch() *Watch {
  18. watch, _ := fsnotify.NewWatcher()
  19. return &Watch{
  20. watch: watch,
  21. }
  22. }
  23. //
  24. func (w *Watch) WatchDir(dir string, b bool, f func()) {
  25. go func(b bool) {
  26. if b {
  27. f()
  28. }
  29. }(b)
  30. filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  31. //判断是否为目录,只监控目录
  32. if info.IsDir() {
  33. path, err := filepath.Abs(path)
  34. if err != nil {
  35. return err
  36. }
  37. err = w.watch.Add(path)
  38. if err != nil {
  39. return err
  40. }
  41. fmt.Println("监控:", path)
  42. }
  43. return nil
  44. })
  45. go func() {
  46. for {
  47. select {
  48. case ev := <-w.watch.Events:
  49. {
  50. if strings.HasSuffix(ev.Name, ".json") && ev.Op&fsnotify.Write == fsnotify.Write {
  51. go f()
  52. }
  53. }
  54. case err := <-w.watch.Errors:
  55. {
  56. fmt.Println("error:", err)
  57. return
  58. }
  59. }
  60. }
  61. }()
  62. }
  63. //
  64. func FSNotifyFUNC(name, dir string, flag bool, f func()) {
  65. if flag {
  66. f()
  67. }
  68. watch, err := fsnotify.NewWatcher()
  69. if err != nil {
  70. log.Println("watch new err", err)
  71. return
  72. }
  73. defer watch.Close()
  74. log.Println("dir:", dir)
  75. err = watch.Add("../tmp")
  76. if err != nil {
  77. log.Println("watch add err", err)
  78. return
  79. }
  80. go func() {
  81. for {
  82. select {
  83. case ev := <-watch.Events:
  84. {
  85. if ev.Op&fsnotify.Write == fsnotify.Write {
  86. now := time.Now().Unix()
  87. //5秒之内 同一个文件不作操作
  88. if applyAction[fmt.Sprintf(name, ev.Name)] != 0 && now-applyAction[fmt.Sprintf(name, ev.Name)] < applyTime {
  89. continue
  90. }
  91. log.Println("修改文件 : ", fmt.Sprintf(name, ev.Name))
  92. applyAction[fmt.Sprintf(name, ev.Name)] = now
  93. time.Sleep(1 * time.Second)
  94. //更新应用版本号
  95. f()
  96. }
  97. }
  98. case err := <-watch.Errors:
  99. {
  100. log.Println("watch error : ", err)
  101. return
  102. }
  103. }
  104. }
  105. }()
  106. }