一、使用库介绍

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. Spring的xml和注解对比

    常用注解 bean定义 XML方式:<bean></bean> 注解方式:@Component 通用组件 @Controller(web层) @Service(service层 ...

  2. Mybatis 二级缓存的使用

    Mybatis二级缓存 简介:二级缓存是namesace级别的,多个SqlSession去操作同个namespace下的Mapper的sql语句,多个SqlSession可以共用二级缓存,如果两个ma ...

  3. MakeSense标注指南

    1.网址 https://www.makesense.ai/ 2.操作流程 2.1 导入 点击get started 点击drop images,上传图片 选择obeject detection 新建 ...

  4. 深入解析 Vue Router:构建单页面应用的利器

    Vue.js 是一个渐进式 JavaScript 框架,常用于构建用户界面.随着应用的复杂度增加,路由(Routing)变得越来越重要,这就是 Vue Router 的用武之地.Vue Router ...

  5. 【漏洞分析】Li.Fi攻击事件分析:缺乏关键参数检查的钻石协议

    背景信息 2024 年 7 月 16日,Li.Fi 协议遭受黑客攻击,漏洞成因是钻石协议中 diamond 合约新添加的 facet 合约没有对参数进行检查,导致 call 函数任意执行.且 diam ...

  6. 前端太卷了,不玩了,写写node.js全栈涨工资,赶紧学起来吧!!!!!

    首先聊下node.js的优缺点和应用场景 Node.js的优点和应用场景 Node.js作为后端开发的选择具有许多优点,以下是其中一些: 高性能: Node.js采用了事件驱动.非阻塞I/O模型,使得 ...

  7. 渐变边框文字效果?CSS 轻松拿捏!

    今天,有个群友问了我这么一个问题,如果不想切图,是否有办法实现带渐变边框的字体效果?如下所示: 本文,就将尝试一下,在 CSS 中,我们可以如何尽可能的实现这种渐变边框字体效果. 元素叠加 首先,比较 ...

  8. 从30个角度对比 PostgreSQL 和 MySQL

    比较版本:PostgreSQL 11    VS      MySQL5.7(innodb引擎) Oracle官方社区版 版权情况:PostgreSQL 11(免费开源).MySQL5.7 Oracl ...

  9. PyCharm配置Miniconda3

    打开PyCharm,点击"File"(文件)菜单,选择"Settings"(设置) 选择python interpreter中的配置 选择add 选择Conda ...

  10. web3 产品介绍: safe --多签钱包 多人审批更放心

    Safe是一款由Gnosis团队开发的多签钱包,它提供了一种安全.灵活和易于使用的方式来管理加密资产.在本文中,我们将介绍Safe的主要特点以及如何使用Safe来保护您的数字资产. 一.Safe的特点 ...