英文:
Hotfolder in Go / wait for file to be written
问题
我正在尝试在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)
}
}
有什么想法/建议吗?
英文:
I am trying to setup a directory as a hotfolder in Go. As soon as a file is finished written to that directory, a function should get called.
Now I came across https://github.com/howeyc/fsnotify that seems to be a good building block for such a hotfolder.
My problem is that fsnotify emits lots of "file changed" events during the write but none when finished, so I assume its not possible that way to see if a process has finished writing files.
So I would think of "wait one second after the last 'file changed' event and then run my function. But I am unsure if this is the best way to deal with the problem and I am not really sure how to integrate this cleanly in the main event loop (from the given github page):
for {
select {
case ev := <-watcher.Event:
log.Println("event:", ev)
case err := <-watcher.Error:
log.Println("error:", err)
}
}
Any idea / advise?
答案1
得分: 6
以下代码将等待,直到至少一秒钟没有收到任何事件,然后调用f()
。
for {
timer := time.NewTimer(1*time.Second)
select {
case ev := <-watcher.Event:
log.Println("事件:", ev)
case err := <-watcher.Error:
log.Println("错误:", err)
case <-timer.C:
f()
}
timer.Stop()
}
英文:
The following code will wait until no event has been received for at least one second and then call 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()
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论