登录
首页 >  Golang >  Go问答

Golang fsnotify 在 Windows 平台下对同一文件发送重复事件

来源:stackoverflow

时间:2024-03-13 10:00:27 198浏览 收藏

大家好,我们又见面了啊~本文《Golang fsnotify 在 Windows 平台下对同一文件发送重复事件》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我正在编写一个简单的 golang 脚本来监视 windows 上的下载文件夹。这个想法是,每当下载新文件时,它都会被发送到打印机。这基本上按预期工作。这是代码:

package main

import (
    "log"
    "fmt"
    "github.com/howeyc/fsnotify"
    "os/exec"
)

func main() {
    watcher, err := fsnotify.newwatcher()
    if err != nil {
        log.fatal(err)
    }

    done := make(chan bool)

    // process events
    go func() {
        for {
            select {
            case ev := <-watcher.event:
                log.println("event:", ev)
                c := exec.command("cmd", "/c", "rawfiletoprinter.exe", ev.name)
                if err := c.run(); err != nil {
                    fmt.println("error: ", err)
                }

            case err := <-watcher.error:
                log.println("error:", err)
            }
        }
    }()

    err = watcher.watch("c:\\users\\admin\\downloads")
    if err != nil {
        log.fatal(err)
    }

    // hang so program doesn't exit
    <-done

    /* ... do stuff ... */
    watcher.close()
}

不幸的是,我发现针对同一文件发送了多个事件,如以下日志所示:

2019/02/11 15:34:26 event: "C:\\Users\\admin\\Downloads\\0fcc8a09-9c51-4c5e-a77c-d4f111f6931f.tmp": CREATE
(*fsnotify.FileEvent)(0x10e821c0)("C:\\Users\\admin\\Downloads\\0fcc8a09-9c51-4c5e-a77c-d4f111f6931f.tmp": CREATE)
2019/02/11 15:34:37 event: "C:\\Users\\admin\\Downloads\\0fcc8a09-9c51-4c5e-a77c-d4f111f6931f.tmp": MODIFY
(*fsnotify.FileEvent)(0x10e821d0)("C:\\Users\\admin\\Downloads\\0fcc8a09-9c51-4c5e-a77c-d4f111f6931f.tmp": MODIFY)
2019/02/11 15:34:40 event: "C:\\Users\\admin\\Downloads\\0fcc8a09-9c51-4c5e-a77c-d4f111f6931f.tmp": RENAME
(*fsnotify.FileEvent)(0x10e821e0)("C:\\Users\\admin\\Downloads\\0fcc8a09-9c51-4c5e-a77c-d4f111f6931f.tmp": RENAME)
2019/02/11 15:34:41 event: "C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt.crdownload": RENAME
(*fsnotify.FileEvent)(0x10e821f0)("C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt.crdownload": RENAME)
2019/02/11 15:34:42 event: "C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt.crdownload": RENAME
(*fsnotify.FileEvent)(0x10e82200)("C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt.crdownload": RENAME)
2019/02/11 15:34:44 event: "C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": RENAME
(*fsnotify.FileEvent)(0x10e82210)("C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": RENAME)
2019/02/11 15:34:46 event: "C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": MODIFY
(*fsnotify.FileEvent)(0x10e82220)("C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": MODIFY)
2019/02/11 15:34:47 event: "C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": MODIFY
(*fsnotify.FileEvent)(0x10e82230)("C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": MODIFY)
2019/02/11 15:34:48 event: "C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": MODIFY
(*fsnotify.FileEvent)(0x10e82240)("C:\\Users\\admin\\Downloads\\Generico-Bill-MULW-132482.txt": MODIFY)

这会导致同一文件被打印多次。 exe 会忽略 *.tmp 和 *.crdownload。是否可以获取单个事件?如果不是,我该如何处理这种情况?


解决方案


首先:*fsnotify.FileEvent 表示您使用的是旧版本的 fsnotify 软件包,请将依赖项更改为:github.com/fsnotify/fsnotify

我没有 Windows 计算机可供测试,因此我不能保证这能解决您的问题。但在我看来,后来的文件修改是属性更改。

仅查看 *.tmp 和 *.crdownload 以外的重命名应该足以打印您的文件,因为您的 RawFileToPrinter.exe 不应该关心该文件是从互联网下载的还是之后设置的任何属性完成下载。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>