脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言fsnotify接口实现监测文件修改

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

2022-06-27 16:24Go语言由浅入深 Golang

这篇文章主要为大家介绍了Go语言fsnotify接口实现监测文件修改的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

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

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

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

安装工具

?
1
$ go get github.com/fsnotify/fsnotify

关键类型

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

Event结构体

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

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

 

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

Op类型

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

 

?
1
2
3
4
5
6
7
8
type Op uint32
const (
    Create Op = 1 << iota
    Write
    Remove
    Rename
    Chmod
)

Watcher结构体

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

 

?
1
2
3
4
5
6
7
8
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对象,并等待事件通知。

 

?
1
func NewWatcher() (*Watcher, error)

完整例子

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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接口监测文件修改的资料请关注服务器之家其它相关文章!

原文链接:https://www.jianshu.com/p/995cd23c69fe

延伸 · 阅读

精彩推荐
  • GolangGo 并发读写 sync.map 详细

    Go 并发读写 sync.map 详细

    阅读本文你将会明确 sync.Map 和原生 map +互斥锁/读写锁之间的性能情况。标准库 sync.Map 虽说支持并发读写 map,但更适用于读多写少的场景,因为他写入的性...

    煎鱼6982021-11-22
  • GolangGolang 日期/时间包的使用详解

    Golang 日期/时间包的使用详解

    这篇文章主要介绍了Golang 日期/时间包的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    big_cat4362020-05-23
  • GolangGo语言eclipse环境搭建图文教程

    Go语言eclipse环境搭建图文教程

    这篇文章主要介绍了Go语言eclipse环境搭建的方法,结合图文形式详细分析了在eclipse环境下开发Go语言所涉及的组件下载、安装及相关设置方法,需要的朋友可...

    轩脉刃7632020-04-30
  • GolangGolang之casbin权限管理的实现

    Golang之casbin权限管理的实现

    这篇文章主要介绍了Golang之casbin权限管理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    HaimaBlog11532021-01-30
  • Golanggolang 接口嵌套实现复用的操作

    golang 接口嵌套实现复用的操作

    这篇文章主要介绍了golang 接口嵌套实现复用的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    学_徒6312021-06-08
  • Golanggolang 40行代码实现通用协程池

    golang 40行代码实现通用协程池

    golang协程机制很方便的解决了并发编程的问题,但是协程并不是没有开销的,所以也需要适当限制一下数量。这篇文章主要介绍了golang 40行代码实现通用协...

    xialeistudio3072020-05-17
  • Golang使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    这篇文章主要介绍了使用Go基于WebSocket构建千万级视频直播弹幕系统,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴...

    BlueMiaomiao4452020-07-26
  • GolangGO语言文件的创建与打开实例分析

    GO语言文件的创建与打开实例分析

    这篇文章主要介绍了GO语言文件的创建与打开的具体用法,实例分析了GO语言文件创建与打开操作中所涉及的函数具体用法,具有一定的参考借鉴价值,需要的朋...

    shichen20145942020-04-11