
1 /*-----------------------------------------------------------------------*/ 2 /* Synchronize the File Object */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_sync ( 6 FIL *fp /* Pointer to the file object */ 7 ) 8 { 9 FRESULT res; 10 DWORD tim; 11 BYTE *dir; 12 13 14 res = validate(fp->fs, fp->id); /* Check validity of the object */ 15 if (res == FR_OK) { 16 if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ 17 #if !_FS_TINY /* Write-back dirty buffer */ 18 if (fp->flag & FA__DIRTY) { 19 if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) 20 LEAVE_FF(fp->fs, FR_DISK_ERR); 21 fp->flag &= ~FA__DIRTY; 22 } 23 #endif 24 /* Update the directory entry */ 25 res = move_window(fp->fs, fp->dir_sect); 26 if (res == FR_OK) { 27 dir = fp->dir_ptr; 28 dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ 29 ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ 30 ST_CLUST(dir, fp->sclust); /* Update start cluster */ 31 tim = get_fattime(); /* Update updated time */ 32 ST_DWORD(dir+DIR_WrtTime, tim); 33 fp->flag &= ~FA__WRITTEN; 34 fp->fs->wflag = 1; 35 res = sync(fp->fs); 36 } 37 } 38 } 39 40 LEAVE_FF(fp->fs, res); 41 }
函數功能:沖洗一個寫文件的緩存信息
描述:
f_sync函數當 _FS_READONLY == 0時可用。
f_sync函數和 f_close函數執行同樣的過程,但是文件仍處於打開狀態,並且可以繼續對文件執行讀/寫/移動
指針操作。這適用於以寫模式長時間打開文件,比如數據記錄器。定期的或f_write后立即執行f_sync可以將
由於突然斷電或移去磁盤而導致數據丟失的風險最小化。在 f_close前立即執行 f_sync沒有作用,因為在
f_close中執行了f_sync。換句話說,這兩個函數的差異就是文件對象是不是無效的。
---------------------------------------- 我是分割線 ----------------------------------------
原文地址:http://blog.sina.com.cn/s/blog_66ffe2770100w2p7.html
當對FAT文件系統的寫操作由於默寫意外而中斷,如突然斷電,不正確的磁盤移除或不可恢復的磁盤錯誤,FAT結構可以被毀壞。下面的圖片顯示了FatFs的臨界段。
紅色區域的中斷會導致一個交叉鏈接,結果,正在修改的文件/目錄可能會丟失。而黃色區域中斷可能導致的效果在下面列出:
正在重寫的文件數據被毀壞。
正在添加內容的文件回到初始狀態。
丟失新建的文件。
一個新建或覆蓋的文件保持長度為0。
因為丟失關聯,磁盤的使用效率變壞。
在文件不是用寫模式打開時,這些情況不會發生。為了最小化磁盤數據的丟失,臨界段可以像圖表5顯示的那樣最小化,通過最小化文件處於寫模式打開的時間或者適當的使用f_sync函數。
---------------------------------------- 我是分割線 ----------------------------------------