(原) 目录监控

原创文章,请后转载,并注明出处。

主要用于目录变化监控,代码未优化,仅实现了功能。

//目录监听功能
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 {}

}

相关文章