一、使用库介绍

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. [oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数

    ​ 十六进制(hexadecimal) 回忆上次内容 上次数制可以转化 bin(n)可以把数字转化为 ​​2进制​ binary 接收一个整数(int) 得到一个二进制数形式的字符串 ​ 编辑 数字在 ...

  2. SQL:聚集索引和非聚集索引

    聚集(clustered)索引,也叫聚簇索引 定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引. 注:第一列的地址表示该行数据在磁盘中的物理地址,后面三列 ...

  3. GUN/Linux 基础教程

    GUN/Linux 基础教程 控制台 shell 超级用户 root 辅助管理 CLI 软件 文件基础 目录 链接 设备文件 控制台 shell 在启动 Linux 系统后,如果没有安装 GUI 的话 ...

  4. SUM-ACM天梯赛

    第一次天梯赛: B-B:孵化小鸡 题解:二进制枚举所有可能性,一个一个枚举出来,@离散数学,真值表. 题目如下: 二进制枚举代码如下 点击查看代码 #include <bits/stdc++.h ...

  5. Python 阿里云OSS文件上传下载与文件删除及检索示例

    阿里云OSS文件上传下载与文件删除及检索示例 实践环境 运行环境: Python 3.5.4 CentOS Linux release 7.4.1708 (Core)/Win10 需要安装以下类库: ...

  6. Vue 结合html2canvas和jsPDF实现html页面转pdf

    结合html2canvas和jsPDF实现html页面转pdf   By:授客 QQ:103355122   实践环境 win10   Vue 2.9.6 axios 0.18.0   html2ca ...

  7. Beizer。。。。。

    <html> <head>AS</head> <script> var cvs; var context; //context.fill();//填充 ...

  8. css3实现背景三角形样式

    话不多说上效果图: css: font-family: PingFang-SC-Heavy, PingFang-SC; font-weight: 800; color: #2160AD; border ...

  9. Pycharm+pytest+allure打造高逼格的测试报告

    环境前置提示:allure是基于Java的一个程序,需要Java1.8的环境,没有安装需要去安装一下. 如果在cmd中能输入java,获取到命令信息则不管,否则需要配置系统变量: 路径:计算机> ...

  10. 【Java】在线文件预览服务 KkFileView

    原来有第三方在线预览服务接口: 需要收费使用: https://view.xdocin.com/ 但是经费不足,突然撤掉服务接口,只能把KkFileView架出来使用了 KkFileView官网地址: ...