Go 实现fsnotify

【官方操作】

package main

import (
        "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

  • 修改权限:

相关推荐

  1. Go 实现fsnotify

    2024-03-25 06:12:05       39 阅读
  2. Go实现MapReduce

    2024-03-25 06:12:05       69 阅读
  3. go简单实现rocketmq

    2024-03-25 06:12:05       63 阅读
  4. go 切面 AOP 实现

    2024-03-25 06:12:05       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 06:12:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 06:12:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 06:12:05       82 阅读
  4. Python语言-面向对象

    2024-03-25 06:12:05       91 阅读

热门阅读

  1. [小程序开发] 模态对话框模块封装

    2024-03-25 06:12:05       37 阅读
  2. 深入了解 Vue 组件

    2024-03-25 06:12:05       38 阅读
  3. 域名系统

    2024-03-25 06:12:05       36 阅读
  4. DNS服务器的分布式架构和集中式架构的区别

    2024-03-25 06:12:05       41 阅读
  5. 【课程】Nginx核心知识100讲

    2024-03-25 06:12:05       38 阅读
  6. 软件包管理(rpm+yum)

    2024-03-25 06:12:05       35 阅读
  7. 在odoo中以超级用户访问记录集

    2024-03-25 06:12:05       46 阅读
  8. python蓝桥杯-算法训练 印章、拿金币、数字游戏

    2024-03-25 06:12:05       38 阅读
  9. 单例模式

    2024-03-25 06:12:05       39 阅读
  10. C#的自述

    2024-03-25 06:12:05       37 阅读