1 Star 0 Fork 0

leonxiong/xtool

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
filewatch.go 2.72 KB
一键复制 编辑 原始数据 按行查看 历史
leonxiong 提交于 2024-12-02 10:25 +08:00 . update xtool
package xfile
import (
"gitee.com/xlm516/xtool/dbg"
"github.com/fsnotify/fsnotify"
"log"
)
type ChangedIf struct {
IfCreate func(rootDir, name string)
IfModify func(rootDir, name string)
IfDelete func(rootDir, name string)
IfRename func(rootDir, name string)
}
type FileMonitor struct {
watch *fsnotify.Watcher
watchPath map[string]string
If ChangedIf
bExit bool
}
func NewMonitor(path string) (*FileMonitor, error) {
w, err := fsnotify.NewWatcher()
if err != nil {
return nil, err
}
fm := &FileMonitor{}
fm.watch = w
fm.watchPath = make(map[string]string)
if path != "" {
fm.watchPath[path] = "1"
fm.watch.Add(path)
}
return fm, nil
}
func (me *FileMonitor) Start() error {
me.do()
return nil
}
func (me *FileMonitor) AddWatch(path string) error {
if me.watch == nil {
return nil
}
_, ok := me.watchPath[path]
if ok {
return nil
}
err := me.watch.Add(path)
if err != nil {
dbg.Dbg("Add Watch: %s, path:%s\n", err.Error(), path)
} else {
me.watchPath[path] = "1"
}
return err
}
func (me *FileMonitor) DelWatch(path string) {
if me.watch == nil {
return
}
delete(me.watchPath, path)
me.watch.Remove(path)
}
func (me *FileMonitor) ResetWatch() {
if me.watch == nil {
return
}
for k, v := range me.watchPath {
me.watch.Remove(v)
delete(me.watchPath, k)
}
}
func (me *FileMonitor) Close() {
me.bExit = true
if me.watch == nil {
return
}
me.watch.Close()
}
func (me *FileMonitor) onCreate(name string) {
//fmt.Println("onCreate: ", name)
if me.If.IfCreate != nil {
me.If.IfCreate("", name)
}
}
func (me *FileMonitor) onModify(name string) {
//fmt.Println("onModify: ", name)
if me.If.IfModify != nil {
me.If.IfModify("", name)
}
}
func (me *FileMonitor) onDelete(name string) {
//fmt.Println("onDelete: ", name)
if me.If.IfDelete != nil {
me.If.IfDelete("", name)
}
}
func (me *FileMonitor) onRename(name string) {
//fmt.Println("onRename: ", name)
if me.If.IfRename != nil {
me.If.IfRename("", name)
}
}
func (me *FileMonitor) onAttrib(name string) {
//fmt.Println("onAttrib: ", name)
}
func (me *FileMonitor) do() {
go func() {
for {
if me.bExit {
return
}
select {
case event := <-me.watch.Events:
//log.Println("event:", event)
if event.Op&fsnotify.Create == fsnotify.Create {
me.onCreate(event.Name)
}
if event.Op&fsnotify.Write == fsnotify.Write {
me.onModify(event.Name)
}
if event.Op&fsnotify.Remove == fsnotify.Remove {
me.onDelete(event.Name)
}
if event.Op&fsnotify.Rename == fsnotify.Rename {
me.onRename(event.Name)
}
if event.Op&fsnotify.Chmod == fsnotify.Chmod {
me.onAttrib(event.Name)
}
case err := <-me.watch.Errors:
log.Println("error:", err)
}
}
}()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/xlm516/xtool.git
git@gitee.com:xlm516/xtool.git
xlm516
xtool
xtool
7db4253cb67d

搜索帮助