使用golang怎么对文件的变化进行监听
短信预约 -IT技能 免费直播动态提醒
本篇文章为大家展示了使用golang怎么对文件的变化进行监听,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
package mainimport ("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 scriptfunc 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 eventfunc 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: %v\n", 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: %v\n", 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 10minutesfunc 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 foldersfunc 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.gitlog_file=/root/nfs_bak_pro/nfs_git_`date +"%Y%m%d"`.log git add --all . >> $log_filegit commit -a -m "`date +"%Y-%m-%d %H:%M:%S"`" >> $log_filegit push origin master >> $log_file
上述内容就是使用golang怎么对文件的变化进行监听,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341