Go 語言跨平臺文件監(jiān)聽庫 Fsnotify 怎么使用?
?1、介紹
Go 語言作為靜態(tài)編譯型語言,每次修改配置文件后,我們都需要重新編譯,修改的配置信息才可以生效,而動態(tài)編譯型語言修改配置文件可以自動生效,相對來說更方便一些。
但是,我們可以使用三方開源庫 fsnotify?,這是一款非常流行的文件系統(tǒng)監(jiān)聽庫,很多開源的三方庫也都使用該庫實現(xiàn)監(jiān)聽文件變更,比如我們之前介紹的非常流行的管理配置信息開源庫 viper。
2、fsnotify 源碼解讀
NewWatcher 函數(shù):
fsnotify? 提供了 NewWatcher 函數(shù),使用該函數(shù)可以創(chuàng)建一個監(jiān)聽器。
閱讀 NewWatcher? 函數(shù)的源碼,我們可以發(fā)現(xiàn),該函數(shù)返回一個 *Watcher。
并且我們可以發(fā)現(xiàn)該結(jié)構(gòu)體的兩個公開字段 Events? 和 Errors? 分別是 Event? 類型和 error? 類型的 channel。
事件:
Event? 類型的字段 Events。
閱讀上面這段代碼,我們可以發(fā)現(xiàn) Event? 包含兩個字段,分別表示事件名稱和操作類型,其中,事件操作類型有 5 個,分別是 Create、Write、Remove、Rename? 和 Chmod。
我們可以啟動一個協(xié)程,使用 for ... select? 監(jiān)聽 watcher? 的 Events? 和 Errors 通道并輸出事件信息和錯誤信息。
Event? 包含 2 個方法,分別是 Has? 和 String,Has 用于判斷事件是否包含給定操作,源碼如下:
監(jiān)聽器:
Watcher? 包含 4 個公共方法,分別是 Add、Close、Remove? 和 WatchList。
- Add - 用于指定監(jiān)聽目錄或監(jiān)聽文件,需要注意的是,指定目錄僅能監(jiān)聽該目錄中的所有文件,無法監(jiān)聽該目錄中子目錄的文件。
- Close - 刪除所有監(jiān)聽,并關(guān)閉 Event 通道。
- Remove - 停止監(jiān)視指定目錄或指定文件的變更,需要注意的是,指定目錄僅代表當(dāng)前目錄,指定目錄中的子目錄需單獨停止監(jiān)聽。刪除未被監(jiān)聽的目錄或文件,將會返回錯誤。
- WatchList - 返回尚未被刪除的所有使用 Ad 添加的目錄或文件。
3、fsnotify 使用示例
在了解完 fsnotify? 源碼之后,我們再介紹一下 fsnotify 的使用示例。
閱讀上面這段示例代碼,我們可以發(fā)現(xiàn),使用 fsnotify 非常簡單。
首先,使用 NewWatcher? 函數(shù)創(chuàng)建一個 watcher?,然后,使用 Add? 方法添加監(jiān)聽目錄或文件,最后,使用 defer? 調(diào)用 Close 方法,關(guān)閉監(jiān)聽器,釋放系統(tǒng)資源。
示例代碼中,啟動一個 goroutine? 循環(huán)輸出事件通道中的事件,發(fā)現(xiàn) Write? 操作類型的事件時,將 log.txt 中的文件內(nèi)容拷貝到標(biāo)準(zhǔn)輸出。
我們可以在運行該程序后,修改 log.txt 中的內(nèi)容,終端將會打印該文件修改后的最新內(nèi)容。
我們可以使用該特性,自動監(jiān)聽?wèi)?yīng)用程序的配置文件,避免修改配置信息后,還需要重新編譯并啟動應(yīng)用才可以生效。
4、總結(jié)
本文我們介紹了跨平臺文件監(jiān)聽庫 fsnotify,它主要用于自動監(jiān)聽文件中的內(nèi)容變更。
我們通過 fsnotify 源碼和示例代碼,介紹了該庫支持的功能和使用方式。
建議感興趣的讀者朋友們,繼續(xù)閱讀該庫的官方文檔和源碼,了解在不同系統(tǒng)平臺中使用的注意事項,并有效運用在自己的項目中。