2012-04-19 25 views
2

打開一個文件進行寫操作後:在調用stat之前,我需要刷新還是關閉文件?

FILE *file = fopen("./file", "w"); 

我可以假設文件被立即創建?它是安全的呼籲:

stat("./file", info); 

或者我應該更好:

fflush(file); 

fclose(file); 

事先?

編輯:fopen的調用後,假設非空文件

+0

嗯,首先,肯定檢查'file!= NULL'。如果它是'NULL',則沒有文件。我無法回答其他部分。 – Matej 2012-04-19 11:57:51

+2

當文件仍然打開時,您可以執行'fstat(fileno(file),&info);' – 2012-04-19 11:59:32

+0

fstat看起來像是一種可能性,我無法找到它是否能夠保證從文件讀取inode描述符將是存儲在磁盤上的描述符。 – Ynv 2012-04-19 12:06:47

回答

2

fopen manual page說:

如果模式是W,WB,A,AB,W +,WB +,W + B,A +,AB +,或a + b,並且文件 以前不存在,在成功完成後,fopen() 函數將標記以更新文件的st_atime,st_ctime和st_mtime 字段以及父文件的st_ctime和st_mtime字段 目錄。

所以我認爲在一個成功的fopen調用後對文件進行統計是安全的。

+0

嗯,我必須假設操作系統不需要設置並堅持inode在這一點上? – Ynv 2012-04-19 12:21:44

1

是的,邏輯上我們可以做到。由於在只讀文件系統中打開用於寫入的文件失敗。這表明fopen()/ open()需要檢查。其他確認方法是通過打開文件x類似於open()的O_EXCL標誌。

1

如果對fopen的調用成功,則表示該文件已創建。該文件可能不會提交(刷新)到磁盤。但是你不必擔心這個,因爲下一次調用stat會從內核緩衝區中獲取文件。

因此,fflushfclose在這種特殊情況下不需要。

很少有時間在你需要把頭衝到磁盤上的時候,就是系統崩潰的可能性。在這種情況下,如果您尚未使用類似fsync的方式將數據完全提交到磁盤,則在下次系統重新啓動時可能會有數據丟失。

相關問題