日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go語言fsnotify接口實現監測文件修改_Golang

作者:Go語言由淺入深 ? 更新時間: 2022-08-19 編程語言

引言

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

該工具就是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 %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

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

  • CREATE動作即臨時文件的創建
  • WRITE寫文件動作
  • CHMOD修改文件屬性
  • REMOVE刪除臨時文件。

原文鏈接:https://www.jianshu.com/p/995cd23c69fe

欄目分類
最近更新