何时在Go中刷新文件?

问题描述 投票:15回答:4

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

go synchronization flush
4个回答
14
投票

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

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

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

你不需要调用.Sync()


13
投票

hereFile.Sync()是对fsync的系统调用。您应该能够在该名称下找到更多。

请记住,fsyncfflush不同,并且在关闭之前不会被执行。

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


2
投票

看起来这里最多的建议是不要调用fsync(),但一般来说它主要取决于你的应用程序要求。如果您正在处理关键文件读/写,则始终建议调用fsync()。

http://www.microhowto.info/howto/atomically_rewrite_the_content_of_a_file.html#idp31936

链接,有关file.Sync()何时有用的更多详细信息。


0
投票

当您想要尽可能确保数据完整性时。例如,如果您的程序在关闭文件之前崩溃会发生什么?

© www.soinside.com 2019 - 2024. All rights reserved.