1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        「GoCN酷Go推薦」跨平臺文件系統(tǒng)監(jiān)控工具 — fsnotify

        共 3850字,需瀏覽 8分鐘

         ·

        2021-09-02 20:02

        簡 介

        在 linux 內(nèi)核中,Inotify 是一種用于通知用戶空間程序文件系統(tǒng)變化的機(jī)制。它監(jiān)控文件系統(tǒng)的變化,如文件新建、修改、刪除等,并可以將相應(yīng)的事件通知給應(yīng)用程序。Inotify 既可以監(jiān)控文件,也可以監(jiān)控目錄。當(dāng)監(jiān)控目錄時(shí),它可以同時(shí)監(jiān)控目錄及目錄中的各子目錄及文件。Golang 的標(biāo)準(zhǔn)庫 syscall 實(shí)現(xiàn)了該機(jī)制。為了進(jìn)一步擴(kuò)展和抽象, github.com/fsnotify/fsnotify 包實(shí)現(xiàn)了一個(gè)基于 channel 的、跨平臺的實(shí)時(shí)監(jiān)聽接口。

        如何使用:

        fsnotify的使用非常簡單:

        • NewWatcher初始化一個(gè) watcher
        • 使用 watcher 的Add方法添加需要監(jiān)聽的文件或目錄到監(jiān)聽隊(duì)列中
        • 創(chuàng)建新的 goroutine,等待管道中的事件或錯(cuò)誤
        package main

        import (
         "fmt"
         "log"

         "github.com/fsnotify/fsnotify"
        )

        func main() {
         // 1、NewWatcher 初始化一個(gè) watcher
         watcher, err := fsnotify.NewWatcher()
         if err != nil {
          log.Fatal(err)
         }
         defer watcher.Close()

         //3、創(chuàng)建新的 goroutine,等待管道中的事件或錯(cuò)誤
         done := make(chan bool)
         go func() {
          for {
           select {
           case e, ok := <-watcher.Events:
            if !ok {
             return
            }
            fmt.Printf("監(jiān)聽到文件 %s 變化| ", e.Name)
            switch e.Op {
            case fsnotify.Create:
             fmt.Println("創(chuàng)建事件", e.Op)
            case fsnotify.Write:
             fmt.Println("寫入事件", e.Op)
            case fsnotify.Remove:
             fmt.Println("刪除事件", e.Op)
            case fsnotify.Rename:
             fmt.Println("重命名事件", e.Op)
            case fsnotify.Chmod:
             fmt.Println("屬性修改事件", e.Op)
            default:
             fmt.Println("some thing else")
            }
           case err, ok := <-watcher.Errors:
            if !ok {
             return
            }
            log.Println("error:", err)
           }
          }
         }()
         // 2、使用 watcher 的 Add 方法增加需要監(jiān)聽的文件或目錄到監(jiān)聽隊(duì)列中
         err = watcher.Add("./")
         if err != nil {
          log.Fatal(err)
         }
         <-done
        }

        運(yùn)行以上代碼,然后執(zhí)行以下操作:

        • 在當(dāng)前目錄創(chuàng)建一個(gè)test.txt
        • 修改權(quán)限為666
        • 重命名為test_2.txt文件
        • 追加內(nèi)容test content
        • 刪除該文件

        觀察程序輸出,如圖:

        需要注意的是:

        • 這里使用touch命令新建文件,實(shí)際會修改文件的時(shí)間屬性,所以會有一個(gè)CREATE事件,一個(gè)CHMOD事件。

        • 重命名時(shí)會產(chǎn)生兩個(gè)事件,一個(gè)是原文件的RENAME事件,一個(gè)是新文件的CREATE事件。

        事件

        這里的事件的結(jié)構(gòu)體fsnotify.Event如下:

        // Event represents a single file system notification.
        type Event struct {
         Name string // Relative path to the file or directory.
         Op   Op     // File operation that triggered the event.
        }

        該結(jié)構(gòu)只有兩個(gè)屬性,Name表示發(fā)生變化的文件或目錄名,Op表示具體的變化。Op有 5 種枚舉:

        // Op describes a set of file operations.
        type Op uint32

        // These are the generalized file operations that can trigger a notification.
        const (
         Create Op = 1 << iota
         Write
         Remove
         Rename
         Chmod
        )

        總結(jié)

        fsnotify的接口非常簡潔,將系統(tǒng)相關(guān)的復(fù)雜性都封裝在了內(nèi)部。方便開發(fā)者監(jiān)聽文件變化然后執(zhí)行后續(xù)自定義操作。fsnotify 不足的是目前它無法遞歸的監(jiān)聽子目錄變更事件,需要我們自已去實(shí)現(xiàn)。

        Reference

        fsnotify/fsnotify: Cross-platform file system notifications for Go. (github.com)

        golang 通過fsnotify監(jiān)控文件,并通過文件變化重啟程序 - 懷素真 - 博客園 (cnblogs.com)

        大俊的博客 (darjun.github.io)


        《酷Go推薦》招募:


        各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到

        新的庫,并且知道怎么用。


        大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名!戳「閱讀原文」,即可報(bào)名


        掃碼也可以加入 GoCN 的大家族喲~


        瀏覽 38
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天干天天操天天射 | 美女又黄免费软件 | 国产伦子伦精品 | 操逼视 | 国产又黄又硬又湿又黄演员表 | 欧美老年人性生活视频 | 欧美成在线观看 | 一级一级一片免费 | 婷婷淫色 | www.caopeng |