![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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函数。
---------------------------------------- 我是分割线 ----------------------------------------