go监视文件改变实现同步--包含遍历文件夹,执行cmd命令,检测文件改变

package main

import (
	"fmt"
	"time"

	"os/exec"

	"strings"

	"io/ioutil"

	"os"

	"github.com/howeyc/fsnotify"
)

const filePath = "/home/ubuntu/GzhuOJ/public"

var watcher *fsnotify.Watcher

func Print(args ...interface{}) {
	fmt.Println(time.Now(), args)
}
func isDir(path string) bool {
	fileInfo, err := os.Stat(path)
	if err != nil {
		Print("error:", err.Error())
		return false
	}
	return fileInfo.IsDir()
}
func watchPath(filePath string) {
	Print("watchPath:", filePath)
	err := watcher.Watch(filePath)
	if err != nil {
		Print(err.Error())
		return
	}
}
func broweDir(path string) {
	Print("broweDir:", path)
	dir, err := os.Open(path)
	if err != nil {
		Print("error:", err.Error())
		return
	}
	defer dir.Close()
	names, err := dir.Readdirnames(-1)
	if err != nil {
		Print("error:", err.Error())
		return
	}
	for _, name := range names {
		dirPath := path + "/" + name
		if !isDir(dirPath) {
			continue
		}
		watchPath(dirPath)
		broweDir(dirPath)
	}
}

func main() {
	var err error
	watcher, err = fsnotify.NewWatcher()
	if err != nil {
		panic(err)
	}
	defer watcher.Close()
	broweDir(filePath)
	watchPath(filePath)
	dealWatch()
}
func dealWatch() {
	for {
		select {
		case event := <-watcher.Event:
			Print("event: ", event)
			if !event.IsModify() && !event.IsCreate() {
				break
			}
			cmd := exec.Command("scp", "-r", "-P 23456", filePath+strings.TrimPrefix(event.Name, filePath), "[email protected]:/home/public")
			Print("cmd:", cmd.Args)
			stderr, err := cmd.StderrPipe()
			if err != nil {
				Print(err.Error())
				break
			}
			stdout, err := cmd.StdoutPipe()
			if err != nil {
				Print(err.Error())
				break
			}
			if err = cmd.Start(); err != nil {
				Print(err.Error())
				break
			}
			errBytes, err := ioutil.ReadAll(stderr)
			if err != nil {
				Print(err.Error())
				break
			}
			outBytes, err := ioutil.ReadAll(stdout)
			if err != nil {
				Print(err.Error())
				break
			}
			if len(errBytes) != 0 {
				Print("errors:", string(errBytes))
			}
			if len(outBytes) != 0 {
				Print("output:", string(outBytes))
			}
		case err := <-watcher.Error:
			Print("error: ", err.Error())
		}
	}
}

  

要注意的是一个fsnotify.Watcher能watch多个文件和文件夹

时间: 2024-12-09 20:36:30

go监视文件改变实现同步--包含遍历文件夹,执行cmd命令,检测文件改变的相关文章

C++ 执行 cmd 命令 删除文件 删除注册表项

#include <Windows.h> WinExec("cmd /C \"del C:\\Windows\\secretWin.ini\"",SW_HIDE); WinExec("cmd /C \"del C:\\Windows\\simpleTrboUpdateInfo.ini\"",SW_HIDE); WinExec("cmd /C \"echo Y | reg delete HKEY_

CMD命令进入文件夹

cmd 进入E文件夹 E: 查看文件夹目录  dir 进入某个文件夹 cd 目录

cmd命令创建文件文件夹

大家好: 学习Java初级视频的时候,毕向东毕老师的第一节课,讲了几个命令,今天来复习一下,做个笔记,大家也共享一下!   cd命令       查看当前路径       cd..             撤回当前路径的上一级路径       dir               查看本路径下的所有文件       md             创建文件夹        例子:md aaa   创建了一个叫做aaa的文件夹       rd               删除文件夹       例子

window10如何在文件夹快速打开cmd命令行

以此文件夹为例 第一步:按住键盘shift不要松开: 第二步:用鼠标右键点击想要用命令行开启的目录:(以test为例)

使用cmd命令打开文件夹

在命令行中输入你想要打开文件所在的磁盘,这里我以打开E:\homework\1.jpg来给大家做示范.在命令行中输入  E:   输入后按下enter键.就进入E盘中,效果如图所示!   如果你想要查看E盘中的文件目录,只用继续输入dir 并且按enter键即显示e盘的文件夹和文件目录!   我们现在要打开的是homework文件夹 故我们继续输入 cd homework 就可以了!但是要注意cd 之后有一个空格哟!   同理我们如果需要查看homework中的目录继续输入dir即可.   现在

cmd命令删除文件夹或文件

删除空文件夹rd /s/q "D:\Program Files\afish" 删除里面的文件del /a/f/q "D:\Program Files\afish\123.txt" 注意:路径带空格,加引号 介绍几个命令:dir 显示目录和文件cd 进入目录del 删除文件rd 删除空目录(目录中不能有子目录和文件)deltree 删除目录并同时删除目录中的子目录以及文件 例如:c:\>c:\>cd "Program files" -这

每天一个linux命令(文件操作):【转载】find命令之exec

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠. {}   花括号代表前面find查找出来的文件名. 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的.在有些操作系统中只允许-ex

Java文件cmd命令行形式运行

首先你得安装好java jdk,配置好相应的环境变量. 你可以在c盘目录下建立一个txt文件. 把文件后缀名改成.java 然后打开命令行,win+r 写上cmd回车常用cmd命令: 文件列表 dir/w进入目录 cd 目录路径 (tab键盘有提示)  cd ..代表上级目录 目录结构打印 tree查看文件内容 type选择文件时可以用tab键来补全 当然,其实有更简洁的方法,就是去到你所要的目录下,按着shift键+右键菜单点击在此处打开命令窗口即可 运行javac编译命令,javac tes

php system 调用命令压缩文件

对一批文件进行压缩处理,采用system 调用linux 压缩命令进行文件压缩. 命令公用代码: function addZip($webdocs, $zipfile, $param, $file){ system("cd $webdocs; tar $param $zipfile \"".$file ."\"",$output); if ($output == 0){ echo " OK\r\n"; return 0; }e