我有一个goroutine,定期检查目录中的新文件,然后打印文件的内容。然而,还有另一个goroutine创建一个文件,将内容写入其中,然后保存文件。
如何忽略目录中以WRITE模式打开的文件?
示例代码:
for {
fileList, err := ioutil.ReadDir("/uploadFiles")
if err != nil {
log.Fatal(err)
continue
}
for _, f := range fileList {
log.Println("File : ", f.Name())
go printContents(f.Name())
}
time.Sleep(time.Second * 5)
}
在printContents goroutine中,我想忽略在WRITE模式下打开的文件。
这不是它的完成方式。
在我的头脑中,我可以想到这些选项:
github.com/fsnotify/fsnotify
开始。
为了正确地写入文件,生产者必须将其数据写入临时文件 - 即位于同一目录但具有文件名的文件,该文件很好地理解为表明文件尚未完成 - 例如, “.foobar.data.part”或“foobar.data.276gd14054.tmp”可以写“foobar.data”。 (存在其他方法,但这个方法足以开始。)
文件准备好后,生产者必须将文件从其临时名称重命名为“正确”的最终名称。这个操作在所有敏感的操作系统/文件系统上都是原子操作,并使文件从消费者的PoV原子上“弹出存在”。例如,inotify
on Linux generates
an event of type "moved to" for such an appearance。
如果你不想自己做正确的事,github.com/dchest/safefile
是一个很好的跨平台开始。
正如您所看到的,使用这种方法,您知道文件只是根据报告显示的事实完成的。