Go语言fsnotify接口实现监测文件修改

目录
  • 前言
    • 安装工具
    • 关键类型
    • Event结构体
    • Op类型
    • Watcher结构体
    • Channel
    • 函数
    • Watcher工厂函数
    • 完整例子

前言

在开发过程中,经常需要观察本地文件系统的更改。经过谷歌了几个小时后,到了一个简单的工具来做这件事。

该工具就是fsnotify是一个Go跨平台文件系统通知工具。它提供了一个简单的接口来监测本地文件系统中的更改。

本文我们就来看看如何使用这个工具。

安装工具

$ go get github.com/fsnotify/fsnotify

关键类型

我们先来了解下fsnotify工具的所有类型。

Event结构体

Event结构体表示单个文件系统通知。

函数String()返回一个“file: REMOVE|WRITE|…”格式字符串表示事件的字符串。

type Event struct {
    Name string    //文件或目录的相对路径
    Op      Op       //文件更改事件
}
func (e Event) String() string

Op类型

该工具描述了一组文件操作。它们是可以触发通知的通用文件操作。

type Op uint32
const (
    Create Op = 1 << iota
    Write
    Remove
    Rename
    Chmod
)

Watcher结构体

Watcher结构体是该工具的核心。包含两个channel和三个函数。

type Watcher struct {
    Events chan Event
    Errors chan error
    ...
}
func (w *Watcher) Add(name string) error
func (w *Watcher) Remove(name string) error
func NewWatcher() (*Watcher, error)

Channel

  • Events 通道
  • Errors 通道

函数

  • Add:非递归监测文件或目录的变化。
  • Remove:停止监测文件或目录。
  • Close:关闭所有文件或目录的监测以及关闭Events通道。

Watcher工厂函数

函数NewWatcher通过底层操作系统调用创建watcher对象,并等待事件通知。

func NewWatcher() (*Watcher, error)

完整例子

import (
    "log"
    "github.com/fsnotify/fsnotify"
)
func main() {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal("new watcher failed: ", err)
    }
    defer watcher.Close()
    done := make(chan bool)
    go func() {
        defer close(done)
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                log.Printf("%s %s\n", event.Name, event.Op)
            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Println("error: ", err)
            }
        }
    }()
    err = watcher.Add("./")
    if err != nil {
        log.Fatal("add failed:", err)
    }
    <-done
}

上面的代码通过启动一个goroutine在后台监测目录或文件的变化,调用函数watcher.Add("./")添加监测的目录是当前目录,也就是main.go文件所在目录。
运行程序后,如果你修改下当前main.go文件会产生如下结果:

Output

2022/06/09 07:01:15 main.go~ CREATE
2022/06/09 07:01:15 main.go WRITE|CHMOD
2022/06/09 07:01:15 main.go~ CREATE
2022/06/09 07:01:15 main.go CHMOD
2022/06/09 07:01:15 main.go WRITE
2022/06/09 07:01:15 main.go~ REMOVE
2022/06/09 07:01:16 main.go CHMOD

上面的输出过程可以发现,修改文件并保存会触发以下动作:

  • CREATE动作即临时文件的创建
  • WRITE写文件动作
  • CHMOD修改文件属性
  • REMOVE删除临时文件。

以上就是Go语言fsnotify接口实现监测文件修改的详细内容,更多关于Go fsnotify接口监测文件修改的资料请关注我们其它相关文章!

(0)

相关推荐

  • golang调用c实现的dll接口细节分享

    目的 本篇文章主要介绍golang在调用c实现的dll时,具体的一些方式.比如值传递.参数传递.指针等等的一些使用. 一.dll的代码 c实现的dll代码: hello.h #ifndef _HELLO_H_ #define _HELLO_H_ #include <stdio.h> #define HELLO_EXPORTS #ifdef HELLO_EXPORTS #define EXPORTS_API extern "C" __declspec(dllexport) #

  • golang组件swagger生成接口文档实践示例

    目录 swagger介绍 gin-swagger实战 第一步:添加注释 第二步:生成接口文档数据 第三步:引入gin-swagger渲染文档数据 swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言.Swagger与一组开源软件工具一起使用,以设计.构建.记录和使用RESTful Web服务.Swagger包括自动文档,代码生成和测试用例生成. 在前后端分离的项目开发过程中,如果后端同学能够提供一份清晰明了的接口文档,那么就能极大地提高大家

  • Go中Writer和Reader接口的使用入门

    目录 引言 Writer 接口 Reader 接口 总结 引言 我们学习其他语言编程时,会学到一个 io 包,这个包可以以流的方式高效处理数据,而不用考虑数据是什么,数据来自哪里,以及数据要发送到哪里的问题. io 是一个 Golang 标准库包,它为围绕输入和输出的许多操作和用例定义了灵活的接口. io 包参见:golang.org/pkg/io/ 与 stdout 和 stdin 对应,Go 语言实现了 io.Writer 和 io.Reader 两个接口.通过实现这两个接口,其他接口都可以

  • 深入Golang的接口interface

    目录 前言 接口转换的原理 实现多态 前言 go不要求类型显示地声明实现了哪个接口,只要实现了相关的方法即可,编译器就能检测到 空接口类型可以接收任意类型的数据: type eface struct { // _type 指向接口的动态类型元数据 // 描述了实体类型.包括内存对齐方式.大小等 _type *_type // data 指向接口的动态值 data unsafe.Pointer } 空接口在赋值时,_type 和 data 都是nil.赋值后,_type 会指向赋值的数据元类型,d

  • go语言interface接口继承多态示例及定义解析

    目录 1.什么是接口 2.接口定义 3.多态 多态加减计算器 4.接口继承与转换 5.空接口 6.接口转换 7.实现map字典接口 8.interface案例 1.什么是接口 接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接.为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了. 在程序开发中,接口只是规定了要做哪些事情,干什么.具体怎么做,接口是不管的.这和生活中接口的案例也

  • Go语言fsnotify接口实现监测文件修改

    目录 前言 安装工具 关键类型 Event结构体 Op类型 Watcher结构体 Channel 函数 Watcher工厂函数 完整例子 前言 在开发过程中,经常需要观察本地文件系统的更改.经过谷歌了几个小时后,到了一个简单的工具来做这件事. 该工具就是fsnotify是一个Go跨平台文件系统通知工具.它提供了一个简单的接口来监测本地文件系统中的更改. 本文我们就来看看如何使用这个工具. 安装工具 $ go get github.com/fsnotify/fsnotify 关键类型 我们先来了解

  • node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用

    在开发或调试Node.js应用程序的时候,当你修改js文件后,总是要按下CTRL+C终止程序,然后再重新启动,即使是修改一点小小的参数,也总是要不断地重复这几个很烦人的操作.有没有办法做到当文件修改之后,Node.js自动重新启动(或重新加载文件)以节省时间呢?一开始我是想到用grunt的watch模块来监控文件变化,但后来在网上一查,原来我们想到的,别人早已想到,并且已经做得很好.Node Supervisor正是这样一个可以实现这种需求的Node.js模块. 根据Github上的说明,Nod

  • Java函数式编程(十二):监控文件修改

    使用flatMap列出子目录 前面已经看到如何列出指定目录下的文件了.我们再来看下如何遍历指定目录的直接子目录(深度为1),先实现一个简单的版本,然后再用更方便的flatMap()方法来实现. 我们先用传统的for循环来遍历一个指定的目录.如果子目录中有文件,就添加到列表里:否则就把子目录添加到列表里.最后,打印出所有文件的总数.代码在下面--这个是困难模式的. 复制代码 代码如下: public static void listTheHardWay() {      List<File> f

  • 使用Java7的Files工具类和Path接口来访问文件的方法

    在日期的java版本中,都是通过File类来访问文件,但是File类的操作有限,不能利用特定文件系统的特性,性能也不高.在访问出错时,很多都是直接返回false,并没有给出异常信息.因此Java7新增了Files和Paths两个工具类来操作文件.Files类中包含了大量的静态方法来操作文件.Java7还引入了一个Path接口,它代表的是与平台无关的平台路径,关于它的用法,下面会做详细的介绍. Paths提供了两个方法用来获取Path对象, 1.get(URL url) 2.get(String

  • Python 监测文件是否更新的方法

    主要逻辑是判断文件的最后修改时间与创建时间是否在秒级别上一致,此代码适用于Python 2. import time import os #Read fime name FileName='D:/scapegoat/xx.csv' #print file creation time print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(os.stat(FileName).st_ctime)) #print file modified tim

  • android调用C语言实现内存的读取与修改的方法示例

    写之前需要准备以下内容 android studio 已ROOT安卓设备 GG修改器 打开android studio,创建Native C++ Project activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro

  • 从C语言中读取Python 类文件对象

    问题 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案 要读取一个类文件对象的数据,你需要重复调用 read() 方法,然后正确的解码获得的数据. 下面是一个C扩展函数例子,仅仅只是读取一个类文件对象中的所有数据并将其输出到标准输出: #define CHUNK_SIZE 8192 /* Consume a "file-like" object and write bytes to stdout */ static PyObj

  • 微服务之间如何通过feign调用接口上传文件

    具体需求: 我们的项目是基于springboot框架的springcloud微服务搭建的,后端服务技术层面整体上分为business服务和core服务,business服务用于作为应用层,直接连接客户端,通常用于聚合数据,core服务用来客户端具体操作不同需求来控制数据库,文件上传是通过客户端上传接口,通过business服务,由服务端调用feign接口,也是第一次做这种文件中转,遇到各种问题,下面是我自己的解决方案,不喜勿喷,代码小白一枚; 一.core服务层接口@requestmapping

  • Android如何监测文件夹内容变化详解

    目录 一. 概述: 二. 监听的事件类型: 三.实例 总结 一. 概述: android.os包下的FileObserver类是一个用于监听文件访问.创建.修改.删除.移动等操作的监听器,基于linux的INotify.FileObserver是个抽象类,必须继承它才能使用.每个FileObserver对象监听一个单独的文件或者文件夹,如果监视的是一个文件夹,那么文件夹下所有的文件和级联子目录的改变都会触发监听的事件. FileObserver简介Android.os包下的FileObserve

  • C语言详细分析讲解多文件的程序设计

    目录 一.多文件与编译器链接 二.多文件之间的相互访问 三.关于#include 四.头文件使用的一些原则 五.再论全局变量 六.注意事项 七.实验程序 八.小结 一.多文件与编译器链接 如下图所示,.o 为目标文件,链接器将不同的目标文件装配组合在一起形成一个可执行文件. 二.多文件之间的相互访问 每个文件可以定义功能接口(可被其它文件访问的函数或数据) 源文件:代码实现文件,后缀为.c 头文件:源文件的接口定义文件,后缀为.h 当需要使用其它文件提供的功能时,包含对应的头文件 语法: #in

随机推荐