Golang fsnotify在Windows上为同一文件发送多个事件

时间:2019-02-11 10:17:33

标签: go inotify

我正在编写一个简单的golang脚本来监视Windows上的Downloads文件夹。这个想法是,每当下载一个新文件时,它将被发送到打印机。这大致上可以预期。这是代码:

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。是否可以举办一个活动?如果没有,我该如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

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

我没有要测试的Windows机器,所以我不能保证这可以解决您的问题。但是在我看来,以后的文件修改是属性更改。

仅查看* .tmp和* .crdownload以外的其他重命名就足以打印文件,因为您的RawFileToPrinter.exe不必关心文件是从Internet下载还是其他任何属性完成下载后设置。