首頁 > 軟體

Go語言fsnotify介面實現監測檔案修改

2022-06-27 18:01:33

引言

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

該工具就是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 uint32
const (
    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 NewWatcher() (*Watcher, error)

Channel

  • Events 通道
  • Errors 通道

函數

  • Add:非遞迴監測檔案或目錄的變化。
  • Remove:停止監測檔案或目錄。
  • Close:關閉所有檔案或目錄的監測以及關閉Events通道。

Watcher工廠函數

函數NewWatcher通過底層作業系統呼叫建立watcher物件,並等待事件通知。

func NewWatcher() (*Watcher, error)

完整例子

import (
    "log"
    "github.com/fsnotify/fsnotify"
)
func main() {
    watcher, err := fsnotify.NewWatcher()
    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 %sn", 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

上面的輸出過程可以發現,修改檔案並儲存會觸發以下動作:

  • CREATE動作即臨時檔案的建立
  • WRITE寫檔案動作
  • CHMOD修改檔案屬性
  • REMOVE刪除臨時檔案。

以上就是Go語言fsnotify介面實現監測檔案修改的詳細內容,更多關於Go fsnotify介面監測檔案修改的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com