简介
上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听文件修改进而自动重新加载。其内部使用的就是fsnotify
这个库,它是跨平台的。今天我们就来介绍一下它。
快速使用
先安装:
$ go get github.com/fsnotify/fsnotify
后使用:
package main
import (
"log"
"github.com/fsnotify/fsnotify"
)
func main() {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal("NewWatcher 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
}
fsnotify
的使用比较简单:
- 先调用
NewWatcher
创建一个监听器; - 然后调用监听器的
Add
增加监听的文件或目录; - 如果目录或文件有事件产生,监听器中的通道
Events
可以取出事件。如果出现错误,监听器中的通道Errors
可以取出错误信息。
上面示例中,我们在另一个 goroutine 中循环读取发生的事件及错误,然后输出它们。
编译、运行程序。在当前目录创建一个新建文本文档.txt
,然后重命名为file1.txt
文件,输入内容some test text
,然后删除它。观察控制台输出:
2020/01/20 08:41:17 新建文本文档.txt CREATE
2020/01/20 08:41:25 新建文本文档.txt RENAME
20