Go实现实时文件监控功能
一、使用库介绍
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 main
import (
"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 main
import (
"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 main
import (
"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 EventInfo
file_path := event.Name //获取事件文件路径
file_name := filepath.Base(file_path) //获取事件文件名
eventTime := time.Now().String()
eventinfo.FileName = file_name
eventinfo.FilePath = file_path
eventinfo.Time = eventTime
if 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 main
type EventInfo struct {
FileName string `json:"file_name"`
FilePath string `json:"file_path"`
Event string `json:"event"`
Time string `json:"time"`
}
eventfuncHandel.go
点击查看代码
package main
import "fmt"
//测试函数
func SendEventinfo(eventinfo EventInfo){
fmt.Printf("%v\n",eventinfo)
}
//文件创建处理
func file_creat(){
fmt.Println("这是文件需要处理的函数。例如上传到服务器")
}
//文件修改处理
func file_write(){
}
//文件删除处理
func file_delet(){
}
//文件重命名或移动
func file_rename(){
}
Go实现实时文件监控功能的更多相关文章
- C#使用FileSystemWatcher控件实现的文件监控功能示例
本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...
- JAVA 实现tail -f 日志文件监控功能
工具: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</ar ...
- 【智能无线小车系列十】通过USB摄像头实现网络监控功能
如果仅有静态图像可能还不足以满足我们的需求,我们可能会需要用到实时的监控功能.这里介绍一款小应用:motion.motion的功能可强大了,不仅可以将监控的画面通过视频传输,实时展现,更为强大的是,m ...
- [Asp.net]SignalR实现实时日志监控
摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统.就想着如果通过.net该如何实现?所以就在想 ...
- SignalR实现实时日志监控
.net SignalR实现实时日志监控 摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统 ...
- Linux下日志文件监控系统Logwatch的使用记录
Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...
- UAVStack的慢SQL数据库监控功能及其实现
UAVStack是一个全维监控与应用运维平台.UAV.Monitor具备监控功能,包含基础监控.应用/服务性能监控.日志监控.业务监控等.在应用监控中,UAV可以根据应用实例画像:其中应用实例组件可以 ...
- ASP.NET Core 之跨平台的实时性能监控
前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...
- Spring Boot开启Druid数据库监控功能
Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目.Druid支持所有JDBC兼容的数据库,包括Oracle.MySQL.Derby.PostgreSQL.SQL Server.H2等.D ...
- Linux系统性能统计工具Sar和实时系统性能监控脚本
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...
随机推荐
- opc ua设备数据 转MQTT项目案例
目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集OPC UA的数据 2 5 用MQTT协议转发数据 4 6 配置参数说明 4 7 上报内容配置 5 ...
- 洛谷P1832
#include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...
- 开源免费又好用的中式数据报表:UReport2是一款高性能的架构在Spring之上纯Java报表引擎,通过迭代单元格可以实现任意复杂的中国式报表。
北润乾.南帆软,数加发力在云端. uReport 身何安?中式报表真开源. 报表江湖之中,uReport安身立命的产品品类定位是什么? 说来很简单,uReport的价值在于填补了这样一个市场空白:开源 ...
- 【干货】顶级 Java 源码教程项目大汇总!
大家好,我是鱼皮,今天分享几个 GitHub 上顶级的 Java 源码教程项目. 区别于书籍.文档.视频等形式的教程,这些项目几乎都是由 精简的代码片段 和 Demo 组成的,能够轻松地在本地执行,非 ...
- [oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态
程序本质 回忆上次内容 \n 就是换行 他对应着 ascii 字符的代码是(10)10进制 他的英文是 LF,意思是Line Feed 我们可以在<安徒 ...
- 题解:P10733 [NOISG2019 Prelim] Lost Array
题解:P10733 [NOISG2019 Prelim] Lost Array 思路 对于任意 \(\min(X_{A_{i}},X_{B_{i}})=C_{i}\). 只要让 \(X_{A_{i}} ...
- 修改PE文件来实现管理员权限
在Windows我们常用的方法就是给应用添加app.manifest清单文件,然后生成的Exe就会具有管理员权限. 近期我在使用Wix制作Exe安装包时,发现此方法不通,我在github上和Stack ...
- python之理解super及MRO列表 ( 示例版 )
例子 1: class A0: def pri(self): super().pri() print("A0") class A1(A0): def pri(self): su ...
- 推荐一款.NET开源、功能强大的二维码生成类库
前言 在日常开发需求中,生成二维码以分享文本内容或跳转至指定网站链接等场景是比较常见的.今天大姚给大家分享一款.NET开源(MIT License).免费.简单易用.功能强大的二维码生成类库:QrCo ...
- ComfyUI插件:efficiency-nodes-comfyui节点
前言: 学习ComfyUI是一场持久战, efficiency-nodes-comfyui是提高工作流创造效率的工具,包含效率节点整合工作流中的基础功能,比如Efficient Loader节点相当于 ...