当前位置: 首页 > news >正文

Go 实现fsnotify

【官方操作】

package mainimport ("log""github.com/fsnotify/fsnotify"
)func main() {watcher, err := fsnotify.NewWatcher()if err != nil {log.Fatal(err)}defer watcher.Close()done := make(chan bool)go func() {for {select {case event, ok := <-watcher.Events:if !ok {return}log.Println("event:", event)if event.Op&fsnotify.Write == fsnotify.Write {log.Println("modified file:", event.Name)}case err, ok := <-watcher.Errors:if !ok {return}log.Println("error:", err)}}}()err = watcher.Add("E:\\test")if err != nil {log.Fatal(err)}<-done
}

        这个只是监控最顶层的目录,如果是子目录的话,就监控不到,所以需要遍历下子目录,依次加入到监控器中

func watchDir(watcher *fsnotify.Watcher,dir string)  {// 遍历子目录filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {// 判断是否为目录,只需要监听目录,目录下的文件变化就可以进行相应操作if info.IsDir(){path, err := filepath.Abs(path)if err != nil {log.Println(err)return err}// 然后将其加入监听if err := watcher.Add(path);err!=nil{log.Printf("watch %s failed. err = %s",path,err.Error())return err}}return nil})
}
watchDir(watcher,"E:\\test")

途中需要新增监控目录的话,需要判断下是否是目录,是的话,直接用Add进入即可

//   如果是目录,则加入监控
fi, err := os.Stat(event.Name)
if err == nil && fi.IsDir() {watcher.Add(event.Name)fmt.Printf("===新增监控:【%s】\n", event.Name)
}
fsnotify有几种监控类型,分别当有哪些行为的时候,会触发
  1. Create:当在监控的目录下创建新的文件或目录时,会触发此事件。例如,使用touch命令创建新文件,或者使用mkdir命令创建新目录。

  2. Write:当监控的文件被写入数据时,会触发此事件。例如,使用echo或,重定向操作向文件写入数据。

  3. Remove:当监控的文件或目录被删除时,会触发此事件。例如,使用rm命令删除文件或目录。

  4. Rename:当监控的文件或目录被重命名或者被移动到其他位置时,会触发此事件。例如,使用mv命令重命名文件或目录。

  5. Chmod:当监控的文件或目录的权限被改变时,会触发此事件。例如,使用chmod命令改变文件或目录的权限。

操作两大类型 :文件 + 目录

文件:新增、修改、删除、重命名、修改权限

  • 新增:Create + Chmod

  • 修改:Create + Write + Rename

  • 重命名:Rename + Create

  • 删除:remove

目录:新增、删除、重命名、修改权限

  • 重命名(难点): rename + create

    • 先rename,在create新目录,最后rename

  • 新增:create

  • 删除: remove

  • 修改权限:

http://www.lryc.cn/news/324837.html

相关文章:

  • Flink GateWay、HiveServer2 和 hive on spark
  • 阿里云国际设置黑白名单(针对高防实例IP)
  • Docker 入门使用说明
  • UE5 LiveLink 自动连接数据源,以及打包后不能收到udp消息的解决办法
  • 国内ip切换是否合规?
  • Flutter 3.13 之后如何监听 App 生命周期事件
  • 基于docker创建深度学习开发环境
  • Linux系统——硬件命令
  • R语言Meta分析核心技术:回归诊断与模型验证
  • 动态规划Dynamic Programming
  • 详解机器学习概念、算法
  • 语音转文字——sherpa ncnn语音识别离线部署C++实现
  • 第1篇:Mysql数据库表结构导出字段到Excel(一个sheet中)
  • Request请求参数----中文乱码问题
  • labelImg安装方法
  • 吴恩达2022机器学习专项课程(一) 3.6 可视化样例
  • C#入门及进阶教程|Windows窗体属性及方法
  • 34-Java传输对象模式 ( Transfer Object Pattern )
  • flutter实现视频播放器,可根据指定视频地址播放、设置声音,进度条拖动,下载等
  • 微服务(基础篇-001-介绍、Eureka)
  • mac 解决随机出现的蓝色框
  • 深入理解与使用go之函数与方法--使用
  • 【QT问题】 Qt信号函数如果重名,调用怎么处理
  • 登山小分队(dfs,模拟)
  • Luminar Neo:重塑图像编辑新纪元,Mac与Win双平台畅享创意之旅
  • 计算机二级Python题库深度解析与备考策略
  • 微信商家转账到零钱:实用指南,涵盖开通、使用与常见问题
  • [精选]Kimi到底是什么,将带来什么?
  • MySQL学习笔记------SQL(2)
  • 【循环神经网络rnn】一篇文章讲透