美文网首页go
Go: 监测文件修改

Go: 监测文件修改

作者: Go语言由浅入深 | 来源:发表于2022-06-09 07:29 被阅读0次

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

该工具就是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: 监测文件修改

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

  • fsnotify问题

    1.windows下修改文件会触发多次,使用记事本修改文件还会导致go读文件失败 2.linux(centos7)...

  • 「WGCLOUD」监测的防篡改文件被删除后会告警吗

    会,如果文件被删除,WGCLOUD会发送告警通知 WGCLOUD 的文件防篡改功能,对于被监测的文件,无论是被修改...

  • vim

    参考: vim + ctags for "go to definition" 示例: 使用vi/vim修改文件fo...

  • 在使用模块的是否报错

    解决方法: 修改go.mod文件添加一行,如果使用goland他会提示你问题,保持就好了。 完整的go.mod文件

  • GO 语言编译过程

    记录go是如何编译的 如何编译及运行修改后的源代码 1.下载GO源码2.进入到go源码的go/src文件夹3.运行...

  • 环境配置

    环境配置go下载地址有需要的童鞋请自行下载执行一下命令建立新项目,生成go.mod文件 修改go.mod增加依赖包...

  • GO代码覆盖率

    1、修改main函数: 2、创建main_test.go文件 1 命名:看一下自己代码的main()函数所在的go...

  • go mod vendor创建工程

    创建空工程 结果是在当前目录下生产一个文件: 创建main.go 引入第三方库 修改main.go 执行go mo...

  • Go-Admin 学习笔记(一)Demo一个简单API

    1、新建一个models文件夹,增加一个admConn.go 2、修改main.go,将数据库连接给GlobalC...

网友评论

    本文标题:Go: 监测文件修改

    本文链接:https://www.haomeiwen.com/subject/lhkpmrtx.html