網站首頁 編程語言 正文
引言
在開發過程中,經常需要觀察本地文件系統的更改。經過谷歌了幾個小時后,到了一個簡單的工具來做這件事。
該工具就是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
相關推薦
- 2022-04-15 詳解Python?prometheus_client使用方式_python
- 2022-11-09 一文帶你了解Go語言中的類型斷言和類型轉換_Golang
- 2023-10-16 Nginx啟動,重啟以及基本命令
- 2022-09-01 C語言中static與sizeof查缺補漏篇_C 語言
- 2022-10-02 Redis常見限流算法原理及實現_Redis
- 2022-10-05 Android開發Activity毛玻璃背景效果_Android
- 2022-11-09 Android性能優化之plt?hook與native線程監控詳解_Android
- 2022-11-23 Android移除Message的方法分享_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支