2012-06-02 9 views
11

をファイルに保存する必要があるのはいつですか?
私はFile.Closeを呼び出すので決して行っていません。自動的にフラッシュされると思いますか?Goでファイルをフラッシュするのはいつですか?

+0

誰かがこれを閉じたいのですか?コメントしてください? –

+0

.Close()が自動的にバイトをストレージにフラッシュすると思いますか? [クローズの原因はこれを示していないようです](https://golang.org/src/os/file_unix.go?s=5591:5619#L179) - 何か不足していますか? –

答えて

12

os.Fileには、バッファリングされていないため、必要がないため、.Flush()が必要ないことがわかります。ファイルへの書き込みは、ファイルに書き込むための直接のシステムコールです。

プログラムが終了すると(たとえクラッシュしても)、開いているすべてのファイルがオペレーティングシステムによって自動的に閉じられ、ファイルシステムはそのディスクに書き込まれたときに変更をディスクに書き込みますあなたのプログラムは終了します)。

を呼び出すos.File.Sync()を呼び出すとfsync()システムコールが呼び出され、ファイルシステムが強制的にバッファをディスクにフラッシュします。これにより、システムの電源が切れていても、オペレーティングシステムがクラッシュしても、データがディスクに保存され、永続的であることが保証されます。

あなたは.Syncを呼び出す必要はありません()

+1

この答えは 'fsync'と' fflush'を混同します。バッファされていないファイルを_flush_する必要はありません。書き込みがディスクにコミットされたことを保証したい場合は、_sync_する必要はありません。 Piotr Praszmoの答えは良いです。 –

0

可能な限りデータの整合性を確保したい場合。たとえば、ファイルを閉じる前にプログラムがクラッシュするとどうなりますか?

10

hereを参照してください。 File.Sync()は、fsyncに至るまでです。あなたはその名前の下でもっと見つけることができるはずです。

fsyncfflushと同じではないため、閉じる前に実行されません。

通常、電話する必要はありません。とにかく、しばらくしてからこのファイルがディスクに書き込まれます。

+2

"一般的に電話する必要はありません" これは、誰かがいつでも電源を切断することができる組み込みデバイスで作業していない場合にのみ当てはまります。 – Joppe

+0

この問題は、組み込みデバイスに限定されるものではありません。同期されていない書き込みはファイルシステムのメモリ内のバッファと共に消滅する危険性は常にありますが、現代のジャーナルファイルシステムでは、そのウィンドウはほとんど消えません。バッテリバックアップされたハードウェアの中には、一貫性をさらに向上させるものがあります。 'sync'は、基礎となるストレージが最新であることをプログラムが認識するようにする方法です。 –

0

は、ここで最も推奨は)(fsyncを呼び出すようにしないようにしているに見えますが、一般的に、それは主に、アプリケーションの要件に依存します。クリティカルなファイルの読み込み/書き込みを行う場合は、常にfsync()を呼び出すことをお勧めします。

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

リンク、file.Sync()が役立つときの詳細を持っています。

関連する問題