fsnotify是一個文件系統監控庫, 它可以支持在如下系統上使用:
- Windows
- Linux
- BSD
- OSX
使用方法來自官方示例:
watcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal(err) } // Process events go func() { for { select { case ev := <-watcher.Event: log.Println("event:", ev) case err := <-watcher.Error: log.Println("error:", err) } } }() err = watcher.Watch("/tmp") if err != nil { log.Fatal(err) } /* ... do stuff ... */ watcher.Close()
注意:
- 當一個文件重命名並移到了另一個目錄, 這個文件將不會繼續被監控, 除非你監控了這個文件所屬的目錄.
- 當一個目錄被監控時,如果想監控它的子目錄需要自己添加子目錄來監控他們
- 你需要自己來處理Error和Event channels
首先里面有幾個核心方法: NewWatcher, Watch, WatchFlags, RemoveWatch, readEvents和purgeEvents
NewWatcher就是通過調用syscall.InotifyInit()首先建立監控初始化.
然后根據返回文件描述符構造Watcher, 同時起兩個goroutine, 分別運行readEvents和purgeEvents, readEvents負責讀取新的事件並發送到internalEvent, purgeEvents負責將internalEvent的事件轉換到Event channel供外部程序使用.
Watch方法就是通過syscall.InotifyAddWatch建立監控列表,並將路徑添加到Watcher結構的paths中.
這里有一些深入學習內部實現的文章, 看完后你會發現fsnotify其實就是在外面加了個殼而已, 結構很簡單. (Linux System Call Table for x86_64, 深入研究可以看操作系統內部實現, 這里還有一個好的Inotify Example 和 使用 inotify 監控文件系統的活動)
至此結束.