Golang 文件监听:使用 watcher 包监听目录变化 (排除特定文件)
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
}
代码解释:
- 导入必要的包:
fmt,github.com/radovskyb/watcher,path/filepath,strings。 - 创建 watcher 实例:
w := watcher.New() - 设置监听操作类型:
w.FilterOps(watcher.Rename, watcher.Move, watcher.Remove)表示只监听重命名、移动和删除操作。 - 添加自定义过滤函数:
w.AddFilterHook(ignoreAtFiles)用于过滤掉以 '@' 开头的文件。 - 启动 goroutine 处理事件: 使用
select语句监听w.Event,w.Error,w.Closed三个 channel。 - 添加监听目录:
w.AddRecursive('.')表示监听当前目录及其子目录。 - 启动监听:
w.Start(watcher.NonBlocking)以非阻塞模式启动监听。 - 自定义过滤函数
ignoreAtFiles: 判断文件名是否以 '@' 开头,如果是则返回watcher.ErrSkip表示忽略该文件。
总结:
通过以上步骤,我们成功地使用 github.com/radovskyb/watcher 包实现了对目录变化的监听,并通过自定义过滤函数排除了特定文件。你可以根据自己的需求修改监听操作类型和过滤逻辑。
原文地址: https://www.cveoy.top/t/topic/jolg 著作权归作者所有。请勿转载和采集!