Go: 監(jiān)測(cè)文件修改

在開(kāi)發(fā)過(guò)程中,經(jīng)常需要觀察本地文件系統(tǒng)的更改。經(jīng)過(guò)谷歌了幾個(gè)小時(shí)后,到了一個(gè)簡(jiǎn)單的工具來(lái)做這件事。

該工具就是fsnotify是一個(gè)Go跨平臺(tái)文件系統(tǒng)通知工具。它提供了一個(gè)簡(jiǎn)單的接口來(lái)監(jiān)測(cè)本地文件系統(tǒng)中的更改。

本文我們就來(lái)看看如何使用這個(gè)工具。

安裝工具

$ go get github.com/fsnotify/fsnotify

關(guān)鍵類型

我們先來(lái)了解下fsnotify工具的所有類型。

Event結(jié)構(gòu)體

Event結(jié)構(gòu)體表示單個(gè)文件系統(tǒng)通知。函數(shù)String()返回一個(gè)“file: REMOVE|WRITE|…”格式字符串表示事件的字符串。

type Event struct {
    Name string    //文件或目錄的相對(duì)路徑
    Op      Op       //文件更改事件
}
 
func (e Event) String() string

Op類型

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

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

Watcher結(jié)構(gòu)體

Watcher結(jié)構(gòu)體是該工具的核心。包含兩個(gè)channel和三個(gè)函數(shù)。

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 通道

函數(shù)

  • Add:非遞歸監(jiān)測(cè)文件或目錄的變化。
  • Remove:停止監(jiān)測(cè)文件或目錄。
  • Close:關(guān)閉所有文件或目錄的監(jiān)測(cè)以及關(guān)閉Events通道。

Watcher工廠函數(shù)

函數(shù)NewWatcher通過(guò)底層操作系統(tǒng)調(diào)用創(chuàng)建watcher對(duì)象,并等待事件通知。

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
}

上面的代碼通過(guò)啟動(dòng)一個(gè)goroutine在后臺(tái)監(jiān)測(cè)目錄或文件的變化,調(diào)用函數(shù)watcher.Add("./")添加監(jiān)測(cè)的目錄是當(dāng)前目錄,也就是main.go文件所在目錄。
運(yùn)行程序后,如果你修改下當(dāng)前main.go文件會(huì)產(chǎn)生如下結(jié)果:

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

上面的輸出過(guò)程可以發(fā)現(xiàn),修改文件并保存會(huì)觸發(fā)以下動(dòng)作:

  • CREATE動(dòng)作即臨時(shí)文件的創(chuàng)建
  • WRITE寫(xiě)文件動(dòng)作
  • CHMOD修改文件屬性
  • REMOVE刪除臨時(shí)文件。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 日常應(yīng)用中,常常會(huì)遇到以下場(chǎng)景,監(jiān)控文件夾A,若文件夾中的B文件發(fā)生變化,則執(zhí)行C命令。Linux下可以通過(guò)ino...
    SkTj閱讀 2,215評(píng)論 0 0
  • Beego官網(wǎng)本身已經(jīng)整理的非常詳細(xì)了,但是作為一個(gè)學(xué)習(xí)者,我還是決定自己好好整理一下,這樣在后面使用的時(shí)候自己對(duì)...
    上下求索zsh閱讀 819評(píng)論 0 0
  • Go對(duì)文件操作的支持很健壯. 下面的程序打開(kāi),讀取并關(guān)閉了一個(gè)文件: File main.go has 29 li...
    asdzxc閱讀 460評(píng)論 0 0
  • 對(duì)網(wǎng)站資源進(jìn)行優(yōu)化,并使用不同瀏覽器測(cè)試并不是網(wǎng)站設(shè)計(jì)過(guò)程中最有意思的部分,但是這個(gè)過(guò)程中的很多重復(fù)的任務(wù)能夠使用...
    懵逼js閱讀 1,163評(píng)論 0 8
  • 作者:Midaoi原文地址:http://www.cnblogs.com/Midaoi/p/4969812.htm...
    IT程序獅閱讀 954評(píng)論 0 5

友情鏈接更多精彩內(nèi)容