Golang 文件监听:使用 watcher 包监听目录变化 (排除特定文件)

本文将介绍如何使用 Golang 的 github.com/radovskyb/watcher 包来监听目录变化,并实现排除特定文件的功能。

目标:

  • 监听当前目录及其子目录下的所有文件变化,包括重命名、移动和删除操作。
  • 忽略所有以 '@' 符号开头的文件。

代码示例:

package main

import (
	'fmt'
	'github.com/radovskyb/watcher'
	'path/filepath'
	'strings'
)

func main() {
	w := watcher.New()

	// 只监听重命名、移动和删除操作
	w.FilterOps(watcher.Rename, watcher.Move, watcher.Remove)
	// 添加自定义过滤函数,忽略以 '@' 开头的文件
	w.AddFilterHook(ignoreAtFiles)

	go func() {
		for {
			select {
			case event := <-w.Event:
				fmt.Println(event)
			case err := <-w.Error:
				fmt.Println(err)
			case <-w.Closed:
				return
			}
		}
	}()

	// 监听当前目录及其子目录
	if err := w.AddRecursive('.'); err != nil {
		fmt.Println(err)
	}

	// 以非阻塞模式启动监听
	if err := w.Start(watcher.NonBlocking); err != nil {
		fmt.Println(err)
	}
}

// 自定义过滤函数,忽略以 '@' 开头的文件
func ignoreAtFiles(info os.FileInfo, fullPath string) error {
	if strings.HasPrefix(filepath.Base(fullPath), '@') {
		return watcher.ErrSkip
	}
	return nil
}

代码解释:

  1. 导入必要的包: fmt, github.com/radovskyb/watcher, path/filepath, strings
  2. 创建 watcher 实例: w := watcher.New()
  3. 设置监听操作类型: w.FilterOps(watcher.Rename, watcher.Move, watcher.Remove) 表示只监听重命名、移动和删除操作。
  4. 添加自定义过滤函数: w.AddFilterHook(ignoreAtFiles) 用于过滤掉以 '@' 开头的文件。
  5. 启动 goroutine 处理事件: 使用 select 语句监听 w.Event, w.Error, w.Closed 三个 channel。
  6. 添加监听目录: w.AddRecursive('.') 表示监听当前目录及其子目录。
  7. 启动监听: w.Start(watcher.NonBlocking) 以非阻塞模式启动监听。
  8. 自定义过滤函数 ignoreAtFiles: 判断文件名是否以 '@' 开头,如果是则返回 watcher.ErrSkip 表示忽略该文件。

总结:

通过以上步骤,我们成功地使用 github.com/radovskyb/watcher 包实现了对目录变化的监听,并通过自定义过滤函数排除了特定文件。你可以根据自己的需求修改监听操作类型和过滤逻辑。

Golang 文件监听:使用 watcher 包监听目录变化 (排除特定文件)

原文地址: https://www.cveoy.top/t/topic/jolg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录