Go: 監測文件修改

在開發過程中,經常需要觀察本地文件系統的更改。經過幾個小時的搜索後,找到了一個簡單的工具來做這件事。

該工具就是 fsnotify[https://github.com/fsnotify/fsnotify] 是一個 Go 跨平臺文件系統通知工具。它提供了一個簡單的接口來監測本地文件系統中的更改。

本文我們就來看看如何使用這個工具。

安裝工具

$ go get github.com/fsnotify/fsnotify

關鍵類型

我們先來了解下 fsnotify 工具的所有類型。

Event 結構體

Event 結構體表示單個文件系統事件通知。函數 String()返回一個 “file: REMOVE|WRITE|…” 格式字符串表示事件的字符串。

type Event struct {
    Name string    //文件或目錄的相對路徑





    Op    Op       //文件更改事件
}




func (e Event) String() string

Op 類型

該工具描述了一組文件操作。它們是可以觸發通知的通用文件操作。

type Op uint32const (
    Create Op = 1 << iota
    Write
    Remove
    Rename
    Chmod
)

Watcher 結構體

Watcher 結構體是該工具的核心。包含兩個 channel 和三個函數。

type Watcher struct {
    Events chan Event
    Errors chan error
    ...

}
func (w *Watcher) Add(name string) error


func (w *Watcher) Remove(name string) error 


func (w *Watcher) Close() error

Channel

函數

Watcher 工廠函數

函數 NewWatcher 通過底層操作系統調用創建 watcher 對象,並等待事件通知。

func NewWatcher() (*Watcher, error)

完整例子

import (   
     "log"
     "github.com/fsnotify/fsnotify"
)
func main() {
    if err != nil {
        log.Fatal("new watcher failed: ", err)

    defer watcher.Close()
    done := make(chan bool)    
    go func() {        
        defer close(done)        
        for {            
           select {            
              case event, ok := <-watcher.Events:               
                    if !ok {                    
                        return
                    }

               log.Printf("%s %s\n", event.Name, event.Op)            
             case err, ok := <-watcher.Errors:                
                    if !ok {                    
                        return
                    }
                  log.Println("error: ", err)
            }
        }
    }()

    err = watcher.Add("./")    
    if err != nil {
        log.Fatal("add failed:", err)
    }

    <-done
}

上面的代碼通過啓動一個 goroutine 在後臺監測目錄或文件的變化,調用函數 watcher.Add("./") 添加監測的目錄是當前目錄,也就是 main.go 文件所在目錄。
運行程序後,如果你修改下當前 main.go 文件會產生如下結果:

Output

2022/06/09 07:01:15 main.go~ CREATE
2022/06/09 07:01:15 main.go WRITE|CHMOD
2022/06/09 07:01:15 main.go~ CREATE
2022/06/09 07:01:15 main.go CHMOD
2022/06/09 07:01:15 main.go WRITE
2022/06/09 07:01:15 main.go~ REMOVE
2022/06/09 07:01:16 main.go CHMOD

上面的輸出過程可以發現,修改文件並保存會觸發以下動作:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/G4F3JKTIrJy2L3zEkatp7w