何时在Go中刷新文件?

16 synchronization flush go

何时需要刷新文件?
我从来没有这样做,因为我调用File.Close,我认为它是自动刷新的,不是吗?

Jes*_*sta 17

您会注意到os.File没有.Flush(),因为它不需要缓存,因为它没有缓冲.写入它是直接系统调用来写入文件.

当您的程序退出时(即使它崩溃),它打开的所有文件都将由操作系统自动关闭,文件系统会在更改时将更改写入磁盘(有时在程序退出后几分钟) .

调用os.File.Sync()将调用fsync()系统调用,这将强制文件系统将其缓冲区刷新到磁盘.即使系统断电或操作系统崩溃,这也可以保证您的数据在磁盘上并且是持久的.

你不需要调用.Sync()

  • 这个答案将`fsync`与`fflush`混淆.您不需要_flush_一个无缓冲的文件.这并不意味着如果您希望保证写入已提交到磁盘,则不需要_sync_它.Piotr Praszmo的答案更好. (2认同)

Pio*_*zmo 15

看到这里.File.Sync()是syscall到fsync.您应该能够在该名称下找到更多.

请记住,fsync这与fflush不同,并且在关闭前不会执行.

您通常不需要调用它.无论如何,在一段时间之后,如果在此期间没有电源故障,该文件将被写入磁盘.

  • "你通常不需要调用它"只有当你不在嵌入式设备上工作时才会这样,有人可以随时决定断开你的电源. (4认同)
  • 该问题不仅限于嵌入式设备。始终存在未同步写入与文件系统的内存缓冲区一起死亡的风险,但对于现代日志文件系统,该窗口非常小。一些电池支持的硬件可以进一步提高一致性。`sync` 是让程序更加了解底层存储是最新的方式。 (2认同)
  • @JonWatte根据手册页,`fsync`会刷新`fdatasync`所做的一切。 (2认同)