最近尝试了一个用 GO 语言监听一个目录(文件)的代码,发现很简单,并且可能用处也挺大的,所以就备份一下。先说一下,这里使用的是一个第三方的库:fsnotify
监听单个目录(文件)
// main
func main() {
var watchDir = "/tmp/test"
// creates a new file watcher
watcher, err := fsnotify.NewWatcher()
if err != nil {
fmt.Println("ERROR", err)
}
defer watcher.Close()
//
done := make(chan bool)
//
go func() {
for {
select {
// watch for events
case event := <-watcher.Events:
fmt.Printf("EVENT -> %s:%s\n", event.Op.String(), event.Name)
// watch for errors
case err := <-watcher.Errors:
fmt.Println("ERROR", err)
}
}
}()
// out of the box fsnotify can watch a single file, or a single directory
if err := watcher.Add(watchDir); err != nil {
fmt.Println("ERROR", err)
}
<-done
}
监听嵌套的目录(文件)
其实就是列举出所有的目录,然后监听他们:
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/fsnotify/fsnotify"
)
var watcher *fsnotify.Watcher
func main() {
watcher, _ = fsnotify.NewWatcher()
defer watcher.Close()
if err := filepath.Walk("/tmp/test", watchDir); err != nil {
fmt.Println("ERROR", err)
}
done := make(chan bool)
go func() {
for {
select {
case event := <-watcher.Events:
fmt.Printf("EVENT! %#v\n", event)
case err := <-watcher.Errors:
fmt.Println("ERROR", err)
}
}
}()
<-done
}
func watchDir(path string, fi os.FileInfo, err error) error {
if fi.Mode().IsDir() {
return watcher.Add(path)
}
return nil
}