1、介绍
Go 语言作为静态编译型语言,每次修改配置文件后,我们都需要重新编译,修改的配置信息才可以生效,而动态编译型语言修改配置文件可以自动生效,相对来说更方便一些。
但是,我们可以使用三方开源库 fsnotify,这是一款非常流行的文件系统监听库,很多开源的三方库也都使用该库实现监听文件变更,比如我们之前介绍的非常流行的管理配置信息开源库 viper。
2、fsnotify 源码解读
NewWatcher 函数:
fsnotify 提供了 NewWatcher 函数,使用该函数可以创建一个监听器。
阅读 NewWatcher 函数的源码,我们可以发现,该函数返回一个 *Watcher。
并且我们可以发现该结构体的两个公开字段 Events 和 Errors 分别是 Event 类型和 error 类型的 channel。
事件:
Event 类型的字段 Events。
阅读上面这段代码,我们可以发现 Event 包含两个字段,分别表示事件名称和操作类型,其中,事件操作类型有 5 个,分别是 Create、Write、Remove、Rename 和 Chmod。
我们可以启动一个协程,使用 for ... select 监听 watcher 的 Events 和 Errors 通道并输出事件信息和错误信息。
Event 包含 2 个方法,分别是 Has 和 String,Has 用于判断事件是否包含给定操作,源码如下:
监听器:
Watcher 包含 4 个公共方法,分别是 Add、Close、Remove 和 WatchList。
- Add - 用于指定监听目录或监听文件,需要注意的是,指定目录仅能监听该目录中的所有文件,无法监听该目录中子目录的文件。
- Close - 删除所有监听,并关闭 Event 通道。
- Remove - 停止监视指定目录或指定文件的变更,需要注意的是,指定目录仅代表当前目录,指定目录中的子目录需单独停止监听。删除未被监听的目录或文件,将会返回错误。
- WatchList - 返回尚未被删除的所有使用 Ad 添加的目录或文件。
3、fsnotify 使用示例
在了解完 fsnotify 源码之后,我们再介绍一下 fsnotify 的使用示例。
阅读上面这段示例代码,我们可以发现,使用 fsnotify 非常简单。
首先,使用 NewWatcher 函数创建一个 watcher,然后,使用 Add 方法添加监听目录或文件,最后,使用 defer 调用 Close 方法,关闭监听器,释放系统资源。
示例代码中,启动一个 goroutine 循环输出事件通道中的事件,发现 Write 操作类型的事件时,将 log.txt 中的文件内容拷贝到标准输出。
我们可以在运行该程序后,修改 log.txt 中的内容,终端将会打印该文件修改后的最新内容。
我们可以使用该特性,自动监听应用程序的配置文件,避免修改配置信息后,还需要重新编译并启动应用才可以生效。
4、总结
本文我们介绍了跨平台文件监听库 fsnotify,它主要用于自动监听文件中的内容变更。
我们通过 fsnotify 源码和示例代码,介绍了该库支持的功能和使用方式。
建议感兴趣的读者朋友们,继续阅读该库的官方文档和源码,了解在不同系统平台中使用的注意事项,并有效运用在自己的项目中。