在开发环境中,监视本地文件系统的变化非常常见。在搜索了几个小时之后,我找到了一个简单的工具来完成这个任务。
这个工具叫做fsnotify,是一个跨平台的Go文件系统通知工具。它提供了一个简单的接口来监视本地文件系统的变化。
让我们在本篇文章中看看如何使用它。
安装首先,安装非常简单。
$ go get github.com/fsnotify/fsnotify
关键类型
让我们熟悉一下fsnotify工具的所有类型。
事件结构
String()
type Event struct {
Name string // Relative path to the file or directory.
Op Op // File operation that triggered the event.
}func (e Event) String() string
操作类型
该工具描述了一组文件操作。它们是可以触发通知的广义文件操作。
type Op uint32const (
Create Op = 1 << iota
Write
Remove
Rename
Chmod
)
观察者结构
Watcher
type Watcher struct {
Events chan Event
Errors chan error // contains filtered or unexported fields
}func (w *Watcher) Add(name string) errorfunc (w *Watcher) Remove(name string) errorfunc (w *Watcher) Close() error
通道:
EventErrors
函数:
AddRemoveClose
创建观察者
NewWatcher
func NewWatcher() (*Watcher, error)
如何使用它?
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
}
下面是监视文件的逐步过程。
- 在第10行创建一个新的观察者
- 在第37行添加要监视的本地文件路径
- 在第22行开始一个新的goroutine,从Event通道监视文件更改事件