cmd_monitor.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package utils
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/fsnotify/fsnotify"
  6. "io/ioutil"
  7. "os"
  8. "path/filepath"
  9. )
  10. // Watch: 监控对象
  11. type Watch struct {
  12. *fsnotify.Watcher
  13. }
  14. func NewWatch() *Watch {
  15. obj, _ := fsnotify.NewWatcher()
  16. return &Watch{obj}
  17. }
  18. // Watch: 监控对象
  19. func (w *Watch) Watch(path string) error {
  20. // 先转化为绝对路径
  21. path, err := filepath.Abs(path)
  22. if err != nil {
  23. return err
  24. }
  25. // 判断是单个文件还是目录文件
  26. fileInfo, err := os.Stat(path)
  27. if err != nil {
  28. return err
  29. }
  30. // 判断是否是目录 添加监控
  31. if fileInfo.IsDir() {
  32. // dir
  33. err = w.watchDir(path)
  34. } else {
  35. err = w.watchFile(path)
  36. }
  37. if err != nil {
  38. return err
  39. }
  40. c := make(chan error)
  41. // 启动监控
  42. go func() {
  43. for {
  44. select {
  45. case even, ok := <-w.Events:
  46. if !ok {
  47. // close
  48. fmt.Println("Errors close")
  49. c <- errors.New("errors close")
  50. return
  51. }
  52. // 判断时间
  53. fmt.Println("even", even)
  54. switch {
  55. // todo 待处理
  56. case even.Op&fsnotify.Create == fsnotify.Create:
  57. //这里获取新创建文件的信息,如果是目录,则加入监控中
  58. fmt.Println("创建文件 : ", even.Name)
  59. _ = w.Add(even.Name)
  60. case even.Op&fsnotify.Write == fsnotify.Write:
  61. fmt.Println("修改 : ", even.Name)
  62. case even.Op&fsnotify.Remove == fsnotify.Remove:
  63. fmt.Println("删除 : ", even.Name)
  64. _ = w.Remove(even.Name)
  65. case even.Op&fsnotify.Rename == fsnotify.Rename:
  66. fmt.Println("重命名 : ", even.Name)
  67. _ = w.Remove(even.Name)
  68. }
  69. case err = <-w.Errors:
  70. c <- err
  71. return
  72. }
  73. }
  74. }()
  75. return <-c
  76. }
  77. // watchDir: 处理监控目录
  78. func (w *Watch) watchDir(path string) error {
  79. // 先将自己添加到监控
  80. err := w.Add(path)
  81. if err != nil {
  82. return err
  83. }
  84. fileSlice, err := ioutil.ReadDir(path)
  85. if err != nil {
  86. return err
  87. }
  88. for _, f := range fileSlice {
  89. fPath := filepath.Join(path, f.Name())
  90. if !f.IsDir() {
  91. // todo 这里加一些条件筛选添加监控的内容
  92. err = w.watchFile(fPath)
  93. if err != nil {
  94. return err
  95. }
  96. } else {
  97. err := w.watchDir(fPath)
  98. if err != nil {
  99. return err
  100. }
  101. }
  102. }
  103. return err
  104. }
  105. // watchDir: 处理监控单文件
  106. func (w *Watch) watchFile(path string) error {
  107. return w.Add(path)
  108. }