Go实现实时文件监控功能

news/2025/1/15 15:39:33/文章来源:https://www.cnblogs.com/iruan/p/18404258

一、使用库介绍

fsnotify 是 Go 语言中的一个库,用于监听文件系统的变更事件。它允许程序注册对文件系统事件的兴趣,并在这些事件发生时接收通知。fsnotify 主要用来监控目录下的文件变化,如创建、删除或修改等。

使用 fsnotify
安装 fsnotify 库。可以通过以下命令来安装:

go get -u github.com/fsnotify/fsnotify

二、简单使用

1.建立监听实例,fsnotidy.newWatcher()
2.设置监听目录,watcher.Add("dir")
3.监听事件,常见的事件有CREATE,RENAME ,CHMOD,WRITE

最简单的demo:

点击查看代码
package mainimport ("fmt""log""github.com/fsnotify/fsnotify"
)func main() {//建立实例watcher, _ := fsnotify.NewWatcher()//设置监听目录watcher.Add(".")defer watcher.Close()done :=make(chan bool)//开始监听go func() {for {select{case event :=<-watcher.Events:log.Println(event,"op:",event.Op,"name:",event.Name,"Op string():",event.Op.String(),"even.op.has:::",event.Op.Has(event.Op))case <-watcher.Errors:fmt.Println("err")}}}()<-done}

三、完整功能实现

main.go

点击查看代码
package mainimport ("flag""log""os"
)// 日志记录
func init() {Logfile, err := os.OpenFile("event_watch.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)if err != nil {log.Println("log file err:", err)return}log.SetOutput(Logfile)
}func main() {deafult_path,_ := os.Getwd()watch_path :=flag.String("dir",deafult_path,"监听的目录,默认为程序所在目录")flag.Parse()WatcherStart(*watch_path)
}

watch.go

点击查看代码
package mainimport ("log""os""path/filepath""time""github.com/fsnotify/fsnotify"
)
// 启动监听主函数
func WatcherStart(watch_path string) {//开启一个监听实例watcher, err := fsnotify.NewWatcher()if err != nil {log.Fatal("watcher erro:", err)}//添加监听的目录,使用一个函数实现动态监听目录。AddWatchDir(watcher,watch_path)//开始监听for {select {case event := <-watcher.Events://有事件发生就触发事件处理EventHandle(event, watcher)case err_ :=<-watcher.Errors:log.Println(err_)}}}// 添加监听目录
func AddWatchDir(watcher *fsnotify.Watcher, dir string) error {err := watcher.Add(dir)if err != nil {log.Fatal("watcher add dir erro:", err)return err}//递归监控子目录,err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.IsDir() {log.Printf("监控文件夹: %s\n", path)err = watcher.Add(path)if err != nil {return err}}return nil})return err
}// 监听处理函数,检测文件或目录的上传,移动,删除
func EventHandle(event fsnotify.Event, watcher *fsnotify.Watcher) {var eventinfo EventInfofile_path := event.Name               //获取事件文件路径file_name := filepath.Base(file_path) //获取事件文件名eventTime := time.Now().String()eventinfo.FileName = file_nameeventinfo.FilePath = file_patheventinfo.Time = eventTimeif file_name == "event_watch.log"{return}switch {//创建事件处理,是目录就添加进监听,文件就处理case event.Op&fsnotify.Create == fsnotify.Create:file_info, _ := os.Stat(file_path)if file_info.IsDir() {log.Println("目录创建")err := AddWatchDir(watcher, file_path)if err != nil {log.Fatal("Event handle watcher add dir erro:", err)}} else {//处理文件添加事件log.Printf("文件创建:%s\n", file_name)eventinfo.Event = "Created"SendEventinfo(eventinfo)//文件处理file_creat()}// 文件修改事件case event.Op&fsnotify.Write == fsnotify.Write:log.Printf("修改文件: %s\n", file_name)eventinfo.Event = "Write"SendEventinfo(eventinfo)// 文件删除事件case event.Op&fsnotify.Remove == fsnotify.Remove:log.Printf("删除文件/目录: %s\n", file_name)eventinfo.Event = "Remove"SendEventinfo(eventinfo)// 文件重命名/移动事件case event.Op&fsnotify.Rename == fsnotify.Rename:log.Printf("重命名文件: %s\n", file_name)eventinfo.Event = "Rename"SendEventinfo(eventinfo)}}

event.go

点击查看代码
package maintype EventInfo struct {FileName string    `json:"file_name"`FilePath string    `json:"file_path"`Event    string    `json:"event"`Time     string `json:"time"`
}

eventfuncHandel.go

点击查看代码
package mainimport "fmt"//测试函数
func SendEventinfo(eventinfo EventInfo){fmt.Printf("%v\n",eventinfo)
}//文件创建处理
func file_creat(){fmt.Println("这是文件需要处理的函数。例如上传到服务器")}//文件修改处理
func file_write(){}//文件删除处理
func file_delet(){}//文件重命名或移动
func file_rename(){}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794393.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix 打通LDAP登录

` dn=dc=localdomain,dc=com 搜索属性=uid 绑定DN=cn=admin,dc=localdomain,dc=com`

tarjan—算法的神(一)

本篇包含 tarjan 求强连通分量、边双连通分量、割点 部分, tarjan 求点双连通分量、桥(割边)在下一篇。伟大的 Robert Tarjan 创造了众多被人们所熟知的算法及数据结构,最著名的如:(本文的)连通性相关的 tarjan 算法,Splay-Tree,Toptree,tarjan 求 lca 等等。 注:有…

gitlab代码恢复

gitlab代码恢复背景: 从gitlab的web端页面下载了代码。需要恢复到新的gitlab上。下面操作以vonebaas-c-fabric-explorer-front工程为例 已经下载好vonebaas-c-fabric-explorer-front工程的zip包:操作步骤 原来的git地址是:http://xxx.git.com:9002/ 新的git地址是:http://1…

Vidful.ai:免费在线AI视频生成器

免费在线AI视频生成器Vidful.ai,无需下载或复杂操作,轻松将文字和图片转换为高质量、电影级视频!免费在线AI视频生成器Vidful.ai,无需下载或复杂操作,轻松将文字和图片转换为高质量、电影级视频! 网址:https://vidful.ai/ 为什么选择Vidful.ai?免费在线平台:无需下载、…

“数据守护,商业共赢” — 华企盾招商会议圆满落幕

在数字化浪潮席卷全球的今天,数据安全已成为企业可持续发展的基石。为了共同探讨数据防护的新策略,推动行业生态的健康发展,我司于2024年9月6日成功举办了一场以“数据守护,商业共赢”为主题的招商会议。此次会议汇聚了来自各行各业的精英人士,共同探讨如何有效应对数据安…

【优技教育】Oracle 19c OCP 082题库(第16题)- 2024年修正版

【优技教育】Oracle 19c OCP 082题库(Q 16题)- 2024年修正版 考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为(CUUG 原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。 原文地址:http://www.cuug.com/index.php?s=/home/article/deta…

Canvas绘制图片合成样式

效果图web * {margin: 0;padding: 0;}.container {position: relative;width: 328px;height: 328px;margin: 100px auto;}.container img {position: absolute;width: 328px;height: 328px;}#canvas {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);…

Axure的画图规范说明

Axure的画图规范说明自定义网页整体尺寸:1366x768;色值:# F8F9FD 顶部一级导航:1366x48;色值:# 1D8FFF 左右布局,左侧边导航:768x194;色值:# 191A23 侧边导航栏宽高:194x768 左侧一级菜单宽高:194x40/边距:16,字号:14,色值:#FFFFFF,图标:14x14,二级导航宽194w,…

解决vscode终端输出中文乱码问题图文教程

由于系统终端默认编码为GBK,所以需要修改为UTF-8 方法一 打开cmd输入chcp查看编码格式,查看以及修改如下图所示:方法二

Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系

通过探索看似不相关的大语言模型(LLM)架构之间的潜在联系,我们可能为促进不同模型间的思想交流和提高整体效率开辟新的途径。 尽管Mamba等线性循环神经网络(RNN)和状态空间模型(SSM)近来备受关注,Transformer架构仍然是LLM的主要支柱。这种格局可能即将发生变化:像Jamba、Samba…