Home > Backend Development > Golang > How to filter duplicate system messages from fsnotify

How to filter duplicate system messages from fsnotify

王林
Release: 2024-02-11 10:03:08
forward
572 people have browsed it

如何从 fsnotify 过滤重复的系统消息

php小编百草在这里与大家分享一种有效的方法,即如何从fsnotify过滤重复的系统消息。在日常的开发工作中,我们经常会遇到需要实时监控文件系统变化的场景,而fsnotify正是一个强大的工具。然而,当系统频繁变动时,可能会导致大量的重复消息出现,给我们的工作带来困扰。因此,本文将教您一种简单而实用的过滤重复系统消息的方法,帮助您提高工作效率。

问题内容

我使用“github.com/fsnotify/fsnotify”来监听文件更改,但是我应该如何多次过滤某些消息?

func listener() {
    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.name, event.op)

                // writing in this way reduces some messages:
                if event.op&fsnotify.rename == fsnotify.rename {
                    // do ...
                } else if event.op&fsnotify.create == fsnotify.create {
                    // do ...
                } else if event.op&fsnotify.write == fsnotify.write {
                    // do ...
                } else if event.op&fsnotify.remove == fsnotify.remove {
                    // do ...
                }
            case _, ok := <-watcher.errors:
                if !ok {
                    return
                }
            }
        }
    }()
    
    err = watcher.add("e:/.../demo")
    if err != nil {
        log.fatal(err)
    }
    <-done
}
Copy after login

比如write、create事件发生了好几次,我发现官方已经修复了bug,但是好像没有完全解决

2022/12/12 21:00:55 event: e:\...\demo\a.bbb create
2022/12/12 21:00:55 event: e:\...\demo\a.bbb create
2022/12/12 21:00:55 event: e:\...\demo\a.bbb create


2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
Copy after login

我应该如何过滤消息?

##############################

var syncMap sync.Map
go func() {
    for {
        select {
        case event, ok := <-watcher.Events:
            if !ok {
                return
            }
            fPath := strings.ReplaceAll(event.Name, "\\", "/")
            pathKey, _ := syncMap.Load(fPath)
            if pathKey != 1 {
                // ...
                syncMap.Store(fPath, 1)

                go func() {
                    time.Sleep(time.Second * 2)
                    syncMap.Delete(fPath)
                }()
            }
        case _, ok := <-watcher.Errors:
            if !ok {
                return
            }
        }
    }
}()
Copy after login

解决方法

如果发出事件的库不在您的控制之下,您只能更改处理重复项的方式。 您可以使用 map[string]bool 来跟踪您已经看到/处理的事件,因此修改您的代码可以执行以下操作:

seenMap := make(map[string]bool)
go func() {
    for {
        select {
        case event, ok := <-watcher.Events:
            if !ok {
                return
            }
            log.Println("event:", event.Name, event.Op)
            _, seen := seenMap[event.Name]
            if !seen {
                // Writing in this way reduces some messages:
                if event.Op&fsnotify.Rename == fsnotify.Rename {
                    // do ...
                } else if event.Op&fsnotify.Create == fsnotify.Create {
                    // do ...
                } else if event.Op&fsnotify.Write == fsnotify.Write {
                    // do ...
                } else if event.Op&fsnotify.Remove == fsnotify.Remove {
                    // do ...
                }
                seenMap[event.Name] = true
            }
        case _, ok := <-watcher.Errors:
            if !ok {
                return
            }
        }
    }
}()
Copy after login

The above is the detailed content of How to filter duplicate system messages from fsnotify. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template