一、使用库介绍

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实现实时文件监控功能的更多相关文章

  1. C#使用FileSystemWatcher控件实现的文件监控功能示例

    本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...

  2. JAVA 实现tail -f 日志文件监控功能

    工具: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</ar ...

  3. 【智能无线小车系列十】通过USB摄像头实现网络监控功能

    如果仅有静态图像可能还不足以满足我们的需求,我们可能会需要用到实时的监控功能.这里介绍一款小应用:motion.motion的功能可强大了,不仅可以将监控的画面通过视频传输,实时展现,更为强大的是,m ...

  4. [Asp.net]SignalR实现实时日志监控

    摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统.就想着如果通过.net该如何实现?所以就在想 ...

  5. SignalR实现实时日志监控

    .net SignalR实现实时日志监控   摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统 ...

  6. Linux下日志文件监控系统Logwatch的使用记录

    Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...

  7. UAVStack的慢SQL数据库监控功能及其实现

    UAVStack是一个全维监控与应用运维平台.UAV.Monitor具备监控功能,包含基础监控.应用/服务性能监控.日志监控.业务监控等.在应用监控中,UAV可以根据应用实例画像:其中应用实例组件可以 ...

  8. ASP.NET Core 之跨平台的实时性能监控

    前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. . 嗯..地址如下: 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲 ...

  9. Spring Boot开启Druid数据库监控功能

    Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目.Druid支持所有JDBC兼容的数据库,包括Oracle.MySQL.Derby.PostgreSQL.SQL Server.H2等.D ...

  10. Linux系统性能统计工具Sar和实时系统性能监控脚本

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

随机推荐

  1. SpringBoot目录文件结构和官方推荐的目录规范、静态资源访问

    目录讲解 src/main/java:存放代码 src/main/resourcces static:存放静态文件,比如css.js.image,(访问方式:http://localhost:8080 ...

  2. 载均衡技术全解析:Pulsar 分布式系统的最佳实践

    背景 Pulsar 有提供一个查询 Broker 负载的接口: /** * Get load for this broker. * * @return * @throws PulsarAdminExc ...

  3. 【2024最新】4000字搞懂sora!一张脑图贯穿!

    话不多说,上图! 下面就是对sora的具体阐释: Sora是OpenAI推出的一款革命性的视频生成模型,能够根据文本指令.静态图像或视频生成长达60秒的完整视频.这一模型基于扩散式模型和自注意力深度学 ...

  4. java一些位运算的方法

    记录一些java位运算的方法 Integer.bitCount:用于记录一个int输转化成二进制之后里面包含了多少个1. 使用例题为leetcode2859 切记下面规则要先转二进制 &相同位 ...

  5. 在Linux中清理Buff/cache

    在 Linux 中,缓冲区和缓存是为提高系统性能而保留的,但如果这些缓存过多,可能会消耗大量内存,影响系统的性能.有时候,您可能需要手动清理这些缓存以释放内存.但请注意,通常不建议定期或频繁地这样做, ...

  6. top的wa,mpstat的%iowait以及pidstat的%wait

    top的wa,mpstat的%iowait以及pidstat的%wait pidstat 中, %wait 表示进程等待 CPU 的时间百分比.等待 CPU 的进程已经在 CPU 的就绪队列中,处于运 ...

  7. 【Vue】el-table 简易表格可筛选列

    需求实现: 代码逻辑: 按钮控件: <el-popover placement="top-start"> <el-checkbox-group v-model=& ...

  8. 【Server】对象存储OSS - Minio

    官方文档: https://docs.min.io/docs/minio-quickstart-guide.html 看中文文档CV命令发现下不下来安装包,应该是地址问题 单击搭建非常简单,只有三个步 ...

  9. 【转载】 tf.image.sample_distorted_bounding_box (为图像生成单个随机变形的边界框)

    原文地址: https://blog.csdn.net/tz_zs/article/details/77920116 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上 ...

  10. python报错:pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

    运行python代码报错: 问题发现: 问题其实十分的狗血,这个代码是在服务器上运行的,运行之前其实并没有看具体的代码情况,git clone 下载下来就直接运行了,原来这个代码需要进行图片绘制,说直 ...