5

我正在尝试将目录设置为 Go 中的热文件夹。一旦文件完成写入该目录,就应该调用一个函数。

现在我遇到了https://github.com/howeyc/fsnotify这似乎是这样一个热文件夹的一个很好的构建块。

我的问题是 fsnotify 在写入期间会发出大量“文件更改”事件,但在完成时不会发出,所以我认为不可能通过这种方式查看进程是否已完成写入文件。

所以我会想到“在最后一个'文件更改'事件后等待一秒钟,然后运行我的函数。但我不确定这是否是解决问题的最佳方法,我不确定如何将它干净地集成到主事件循环(来自给定的 github 页面):

for {
    select {
    case ev := <-watcher.Event:
        log.Println("event:", ev)
    case err := <-watcher.Error:
        log.Println("error:", err)
    }
}

有什么想法/建议吗?

4

1 回答 1

6

以下代码将等待至少一秒钟没有收到任何事件,然后调用f().

for {
    timer := time.NewTimer(1*time.Second)

    select {
    case ev := <-watcher.Event:
        log.Println("event:", ev)
    case err := <-watcher.Error:
        log.Println("error:", err)
    case <-timer.C:
        f()
    }

    timer.Stop()
}
于 2012-11-17T20:55:06.230 回答