主要用于目录变化监控,代码未优化,仅实现了功能。
//目录监听功能
package main
import (
"flag"
"log"
"fmt"
"path/filepath"
"os"
"github.com/fsnotify/fsnotify"
"github.com/soease/tools"
)
func onWatch(str string, cmd string){
log.Println( str + ", 执行命令。")
tools.Shell(cmd)
}
func main() {
path := flag.String("path", ".", "要监听的目录")
cmd := flag.String("command","blog", "当目录发生变化时,执行的命令")
flag.Parse()
//创建一个监控对象
watch, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watch.Close()
//通过Walk来遍历目录下的所有子目录
filepath.Walk(*path, func(path string, info os.FileInfo, err error) error {
//这里判断是否为目录,只需监控目录即可
//目录下的文件也在监控范围内,不需要我们一个一个加
if info.IsDir() {
path, err := filepath.Abs(path);
if err != nil {
return err;
}
err = watch.Add(path);
if err != nil {
return err;
}
fmt.Println("监控 : ", path);
}
return nil;
});
//我们另启一个goroutine来处理监控对象的事件
go func() {
for {
select {
case ev := <-watch.Events:
{
// Create 创建
// Write 写入
// Remove 删除
// Rename 重命名
// Chmod 修改权限
if ev.Op&fsnotify.Create == fsnotify.Create {
onWatch("创建文件 : " + ev.Name, *cmd)
}
if ev.Op&fsnotify.Write == fsnotify.Write {
log.Println("写入文件 : ", ev.Name)
onWatch("写入文件 : " + ev.Name, *cmd)
}
if ev.Op&fsnotify.Remove == fsnotify.Remove {
onWatch("删除文件 : " + ev.Name, *cmd)
}
if ev.Op&fsnotify.Rename == fsnotify.Rename {
onWatch("重命名文件 : " + ev.Name, *cmd)
}
if ev.Op&fsnotify.Chmod == fsnotify.Chmod {
log.Println("修改权限 : ", ev.Name)
}
}
case err := <-watch.Errors:
{
log.Println("error : ", err)
return
}
}
}
}()
//循环
select {}
}