本篇文章小编给大家分享一下golang监听文件变化代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
官网demo
package main import ( "log" "github.com/fsnotify/fsnotify" ) func main() { watcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal(err) } defer watcher.Close() done := make(chan bool) go func() { for { select { case event, ok := <-watcher.Events: if !ok { return } log.Println("event:", event) if event.Op&fsnotify.Write == fsnotify.Write { log.Println("modified file:", event.Name) } case err, ok := <-watcher.Errors: if !ok { return } log.Println("error:", err) } } }() err = watcher.Add("/tmp/foo") if err != nil { log.Fatal(err) } <-done }
补充:golang监控文件变化,git自动提交代码
代码如下:
如果文件有变动,且10分钟内,没有再次变动,则提交代码
package main import ( "fmt" _ "fmt" "github.com/fsnotify/fsnotify" "log" "os" "os/exec" "path/filepath" "time" ) //if the conditions are met, execute the shell script func execCmd() { cmd := exec.Command("/root/nfs_bak_pro/nfs.git.sh") err := cmd.Run() if err != nil { fmt.Println("Execute Command failed:" + err.Error()) return } fmt.Println("Execute Command finished.") } //handle folder files changed event func watchFiles(watcher *fsnotify.Watcher, ch chan int64) { for { select { case ev := <-watcher.Events: { isNotify := false if ev.Op & fsnotify.Create == fsnotify.Create { log.Println("create : ", ev.Name) isNotify = true file, err := os.Stat(ev.Name) if err == nil && file.IsDir() { watcher.Add(ev.Name) fmt.Println("add watch : ", ev.Name) } } if ev.Op & fsnotify.Remove == fsnotify.Remove { log.Println("delete : ", ev.Name) isNotify = true err := watcher.Remove(ev.Name) fmt.Printf("remove watch: %s, err: %vn", ev.Name, err) } if ev.Op & fsnotify.Rename == fsnotify.Rename { log.Println("rename : ", ev.Name) if "" != ev.Name { isNotify = true err := watcher.Remove(ev.Name) fmt.Printf("remove watch: %s, err: %vn", ev.Name, err) } } if isNotify { ch <- time.Now().Unix() } } case err := <-watcher.Errors: { log.Println("watcher error : ", err) return } } } } //if folder event met, execute the shell script after 10minutes func watchTime(ch chan int64) { var timer *time.Timer for { select { case <- ch:{ if nil != timer { log.Printf("reset timer") timer.Stop() } timer = time.NewTimer(10 * 60 * time.Second) go func() { <-timer.C execCmd() }() } } } } //watch the folder and sub folders func WatchDir(watcher *fsnotify.Watcher, dir string) { filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { if info.IsDir() { path, err := filepath.Abs(path) if err != nil { return err } err = watcher.Add(path) if err != nil { return err } } return nil }) } func main() { notifyCh := make(chan int64) watcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal(err) } defer watcher.Close() WatchDir(watcher, "/data/nfs") go watchFiles(watcher, notifyCh) go watchTime(notifyCh) select {} }
shell 脚本如下
#!/bin/bash cd /root/nfs_bak_pro/nfs.git log_file=/root/nfs_bak_pro/nfs_git_`date +"%Y%m%d"`.log git add --all . >> $log_file git commit -a -m "`date +"%Y-%m-%d %H:%M:%S"`" >> $log_file git push origin master >> $log_file
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级