8.09.2007

fopen with "w" cause file reset

fopen( )使用 "w" 作為 open mode。如果open的file已經存在,在一open時,file會被reset (清空)。
一直到fclose( )之後,file 內容才會真正的update。
除非在中途用fflush( )強制update。

所以..
若是系統在 fopen( )後,fclose( )之前。系統被reset (power down)的話,被open 的 file 就變成 empty 了。

MSDN fopen

使用CreateFile( ) , WriteFile( ),CloseHandle( )就不會。
即使是用 CREATE_ALWAYS, GENERIC_WRITE。

在CloseHandle( )之前被reset的話。原file內容不會改變 。

在CloseHandle( )之前,該file 的內容都是舊的 (不會被清空)。

MSDN CreateFile

這是只有WindowsCE的fopen( )才是這樣,還是所有的OS都是這樣 ?

PS : 以上動作跟 Media 有關,在Nandflash create的partition 是這樣。
在 SD card則不一樣。

SD card 在 fclose( ) 和 CloseHandle( ) 前reset 的話,該file 會keep 原內容。

2 則留言:

Kun-Yi 提到...

這個問題應該是 看compiler
因為 fopen 等函式 是 C Standard Library 中的標準函式
一般會有 input/output buffer
用來減少Disk I/O request time

所以要看compiler 是怎樣做的
如果寫的資料大過 write buffer
就自己就會flush 了
資料量很小的話
才會發生你說的問題

fopen 裡面的底層也是會去call system file interface 的
所以看自己的取捨吧

Checko 提到...

嗯,說得也對,小的embedded system, stdio 是沒有buffer的。大的系統才會有。

這個問題糟糕的是在embedded system中,系統隨時都有被reset的可能....