在好例子网,分享、交流、成长!
您当前所在位置:首页Go 开发实例Go语言基础 → 文件变动监控(监控某文件夹的文件变化)

文件变动监控(监控某文件夹的文件变化)

Go语言基础

下载此实例
  • 开发语言:Go
  • 实例大小:0.81M
  • 下载次数:4
  • 浏览次数:230
  • 发布时间:2019-04-01
  • 实例类别:Go语言基础
  • 发 布 人:public2012
  • 所需积分:1
 相关标签: 文件 监控

实例介绍

【实例简介】

可以使用创建一个watcher来对某个文件夹进行监控

【实例截图】

【核心代码】

// FileLock project main.go
package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"time"

	"github.com/fsnotify/fsnotify"
)

var fileLog *os.File
var debuglog *log.Logger

func CheckErr(err error) {
	if fileLog == nil {
		logfilename, _ := os.Getwd()
		logfilename  = "\\op.log"
		log.Println(logfilename)
		if _, err := os.Stat(logfilename); err == nil {
			err = os.Rename(logfilename, logfilename "bak")

			if err != nil {
				err = os.Remove(logfilename)
				if err != nil {
					log.Println("删除成功")
				}
			}

		}
		fileLog, err = os.Create(logfilename)
		if err != nil {
			log.Println("日志创建出错:", err)
		}
		debuglog = log.New(fileLog, "", log.LstdFlags)
	}

	if nil != err {
		debuglog.Println("日志:", err)
	}
}

type Commfun struct {
	nowfile string
}

func NewCommfun() (*Commfun, error) {
	cf := &Commfun{}
	return cf, nil
}
func (g *Commfun) opFiles(ev fsnotify.Event) error {
	if g.nowfile == ev.Name {
		return nil
	}
	g.nowfile = ev.Name
	if ev.Op&fsnotify.Write == fsnotify.Write {
		debuglog.Println("旧文件内容变动事件:", ev.Name)
		err := os.Remove(strings.Replace(ev.Name, "\\", "\\\\", -1))
		log.Println(err)
		if err != nil {
			debuglog.Println("旧文件被篡改异动监控【----------------失败-----------------】:", err, ev.Name)
		} else {
			debuglog.Println("旧文件被篡改异动监控【处理动作:隔离】:", ev.Name)
		}
	} else if ev.Op&fsnotify.Create == fsnotify.Create {
		debuglog.Println("创建新文件事件:", ev.Name)
		fi, err3 := os.Stat(ev.Name)
		if err3 != nil {
			debuglog.Println("新增文件夹【-----------------------监控失败----------------】:", err3, ev.Name)
		}
		if fi.IsDir() {
			g.Guard(ev.Name)
		} else {
			err := os.Remove(strings.Replace(ev.Name, "\\", "\\\\", -1))

			if err != nil {
				debuglog.Println("新文件写入删除【----------------失败-----------------】:", err, ev.Name)
			} else {
				debuglog.Println("新文件写入异动监控【处理动作:隔离】:", ev.Name)
			}
		}

	} else {
		debuglog.Println("默认事件记录:s%", ev.Name, ev.Op)
	}
	return nil
}

func (g *Commfun) Guard(fullPath string) {
	start := time.Now()
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		debuglog.Fatal(err)
	}
	defer watcher.Close()

	done := make(chan bool)
	go func() {
		count := 0
		for {
			select {
			case event := <-watcher.Events:
				err = g.opFiles(event)
			case err := <-watcher.Errors:
				count  
				if count > 100 {
					debuglog.Println("计数器显示:文件监错误太多")
					break
				}
				debuglog.Println("监听文件出错:", err)
			}
		}
	}()

	fullPath, _ = filepath.Abs(fullPath)
	err = watcher.Add(fullPath)
	filepath.Walk(fullPath, func(path string, fi os.FileInfo, err error) error {

		if nil == fi {
			CheckErr(err)
			return err
		}
		if fi.IsDir() {

			err = watcher.Add(strings.Replace(path, "\\", "\\\\", -1))
			if err != nil {
				debuglog.Println(err)
			}
			return err
		}
		return nil
	})
	fmt.Println("监控文件处理监听处理时间约%f秒", time.Now().Sub(start).Seconds())
	if err != nil {
		debuglog.Println(err)
	}
	<-done
}
func main() {
	done := make(chan bool)
	cn, err := NewCommfun()
	CheckErr(err)
	go cn.Guard("E:\\")
	//go cn.Guard(os.Args[1])

	<-done
	ExitFunc()
}
func ExitFunc() {
	fmt.Println("i am exiting!")

	cmd := exec.Command("D:\\开发\\golang\\work\\src\\FileLock\\FileLock.exe", " E:\360Downloads", " ")

	err := cmd.Run()
	fmt.Println(err)
}

标签: 文件 监控

实例下载地址

文件变动监控(监控某文件夹的文件变化)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
;
报警
var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_4847253'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s13.cnzz.com/stat.php%3Fid%3D4847253' type='text/javascript'%3E%3C/script%3E"));