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.mzph.cn/news/768545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Docker Compose 部署 Spring Boot 应用

使用 Docker Compose 部署 Spring Boot 应用 第一步&#xff1a;创建 Spring Boot 应用的 Dockerfile 在您的 Spring Boot 项目根目录中创建一个 Dockerfile。 编辑 Dockerfile&#xff0c;添加以下内容&#xff1a; # 基础镜像使用 OpenJDK FROM openjdk:11-jdk-slim# 维护者…

Gitee删除自己本地仓库

1、打开自己的本地仓库 2、点击管理 3、选择删除仓库 4、将□的内容复制到⭕里

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 &#xff08;一&#xff09;存储引擎概念 &#xff08;二&#xff09;MySQL常用的存储引擎 &#xff08;三&#xff09;存储引擎运作方式 二 MyISAM 存储引擎介绍 &#xff08;一&#xff09; MyISAM 存储引擎特点 1&#xff0c;不支持…

基于51单片机数控直流电压源proteus仿真LCD显示+程序+设计报告+讲解视频

基于51单片机数控直流电压源proteus仿真LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0072 讲解视频 基于51单片机数控直流电压源proteus仿真程序…

手机IP地址如何更换

手机IP地址的修改方法可以通过以下几种方式实现&#xff1a; 1. 手动更改IP地址&#xff1a;打开手机设置&#xff0c;进入网络设置页面&#xff0c;找到IP地址更改选项。在此页面输入新的IP地址和子网掩码&#xff0c;并启用DHCP服务器。请注意&#xff0c;并非所有手机都支持…

博途建立S7-1200PLC与HMS AB7013Profinet通讯

1、新建一个博图项目1200PLC .CPU 1214C ACDC/RIY 6ES7 214-1BG31-0x80 2、安装GSD文件 Install general station description fle (GsD) GSDMLV2.3-HMS-ABC PROFINET GSD 3、连接PLC 4、在线访问 5、增加访问子网络 6、设定IP地址 7、增加AnyBus模块 8、设定模块的IP地址及…

大语言模型(Large Language Model,LLM)简介

1. 什么是大语言模型 它是一种基于深度学习的人工智能模型&#xff0c;它从大量来自书籍、文章、网页和图像等来源的数据中学习&#xff0c;以发现语言模式和规则&#xff0c;如处理和生成自然语言文本。通常&#xff0c;大语言模型含数百亿&#xff08;或更多&#xff09;参数…

Spring Cloud Gateway Server MVC

之前你如果要用spring cloud gateway &#xff0c;就必须是webflux 的&#xff0c;也就是必须是异步响应式编程。不能和spring mvc 一起使用。现在spring cloud 新出了一个可以不用webflux的gateway。 具体使用mvc的gateway步骤如下 普通的Eureka Client的项目 如果你只是想测…

Qt程序可执行文件打包

目录 一、新建一个目录二、命令行2.1 添加临时变量2.2 打包命令 三、添加动态库四、普通 Qt 项目打包 Qml 项目打包 笔者写的python程序打包地址&#xff08;https://blog.csdn.net/qq_43700779/article/details/136994813&#xff09; 一、新建一个目录 新目录(例如test)用以…

超高并发下Redis热点数据风险破解

1 介绍 作者是互联网一线研发负责人,所在业务也是业内核心流量来源,经常参与 业务预定、积分竞拍、商品秒杀等工作。 近期参与多场新员工的面试工作,经常就 『超高并发场景下热点数据』 可用性保障与候选人进行讨论。 本文聚焦一些关键点技术进行讨论,并总结一些热点场景…

js 获取对象的属性名(key)列表

js 获取对象的属性名(key)列表 keys() 方法获取 values()可以获取键值列表 const person {name: "Bill",age: 19,eyeColor: "blue" }; const keys Object.keys(person); console.log(keys)// [name, age, eyeColor]for in 语句获取 const person {na…

vue文件的结构和API

1. vue文件的结构 script&#xff1a;控制模板的数据和行为&#xff08;注意不要少了setup&#xff09; <script setup>import {ref} from "vue"; </script> template&#xff1a;模板部分,由它生成HTML <template><h1>{{msg}}</h1&g…

函数封装冒泡排序

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 一、冒泡排序 冒泡排序是最常见的一种排序算法&#xff0c;按照指定顺序比较相邻元素&#xff0c;如果顺序不同&#xff0c;就交换元素位置&#xff0c;每一趟比较&#xff0c;都会导致…

AI:153-开发一种能够自动化生成电影剧本的人工智能系统

本文收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正在不断更新中~ 一.开发一种能够自动化生成电影剧本的…

vscode的一些技巧

技巧1&#xff1a;调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项&#xff1a; “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2&#xff1a;断点 普通断点使…

网络协议栈--传输层--UDP/TCP协议

目录 本节重点一、再谈端口号1.1 再谈端口号1.2 端口号范围划分1.3 认识知名端口号(Well-Know Port Number)1.4 回答两个问题1.5 netstat1.6 pidof 二、UDP协议2.1 UDP协议段格式2.2 UDP的特点2.3 面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议2.7 UDP…

生产力工具|安装更新R软件(R、studio)

内容介绍&#xff1a; 安装R软件&#xff1a; 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导&#xff0c;选择安装路径&#xff0c;取消…

javascript单例模式字面量定义的接口和匿名函数定义的接口;他们之间访问私有变量和私有函数之间的区别

javascript的单例模式&#xff1a;即只有一个实例&#xff1b; 模块模式是在单例模式上扩展而来的 //这种是字面量定义了单例对象的公共接口&#xff1b; 字面量对象调用私有变更和私有函数 var Book(function(){let name;checkBookfunction(value){namevalue;}return{setNam…

k8s的volumn解析

背景 k8s中有一套自己的存储逻辑&#xff0c;它和docker中的volumn类似&#xff0c;本文就来看一下k8s的volunm的存储设计 k8s的volumn 1.EmptyDir类型的volumn 这种类型的volumn是Pod内的容器共享的&#xff0c;volumn的生命周期和Pod的生命周期是一致的&#xff0c;不过大…

Day08 Java复习8 Spring MVC概念

Day09 Java复习9 Spring MVC spring mvc 的核心组件是什么&#xff1f; DispatcherServlet 1.JAVA 和Spring 、Spring Boot 、Spring MVC的关系 你要举办一个生日派对&#xff0c;而且你希望它既特别又好玩。Java就像是举办派对的地方&#xff0c;Spring、Spring Boot和Spri…