在开发环境中,监视本地文件系统的变化非常常见。在搜索了几个小时之后,我找到了一个简单的工具来完成这个任务。

这个工具叫做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通道监视文件更改事件