Fatfs删除SD卡文件导致文件系统损坏

2019-07-20 10:33发布

Fatfs的版本是最新的R0.10c。
我目前用SPI的方式和SD卡通讯,在不断的摸索之后,读写终于正常了,虽然写卡的速度非常慢。
于是我继续添加其他功能,比如删除文件或文件夹。用的是fatfs官网的代码。
但每次删除完后,我把SD卡插到电脑上,检查磁盘都会显示检测到问题,然后自动修复了,并在SD卡里写入FOUNDxx文件夹。
有趣的是,我用以下函数删除文件或文件夹并不会返回错误。但为什么SD的文件系统却损坏了呢?
经查f_unlink函数在文件打开时可能导致卷损坏,但我的函数都会在打开文件之后关闭文件。
那么问题是, f_readdir和f_opendir会不会打开文件呢?从而导致删除文件时损坏文件系统。

检查磁盘的方法见链接:http://jingyan.baidu.com/article/a3a3f8118f24498da3eb8a48.html
FRESULT empty_directory(char *path)
{
    UINT i, j;
    FRESULT fr;
    DIR dir;
    FILINFO fno;
// path:Working buffer filled with start directory

#if _USE_LFN
    fno.lfname = 0; // Disable LFN output
#endif
//f_chdir
    fr = f_opendir(&dir, path);
    if (fr == FR_OK)
    {
        for (i = 0; path; i++);
        path[i++] = '/';
        for (;;)
        {
            fr = f_readdir(&dir, &fno);
            if (fr != FR_OK || !fno.fname[0]) break;
            if (_FS_RPATH && fno.fname[0] == '.') continue;
            j = 0;
            do
            {
                path[i+j] = fno.fname[j];
            }while (fno.fname[j++]);
            if (fno.fattrib & AM_DIR)
            {
               fr = empty_directory(path);
                if (fr != FR_OK) break;
            }
//The file/sub-directory must not be opened, Fatfs官方资料
//or the FAT volume can be collapsed.
//It can be rejected with FR_LOCKED when file lock feature is enabled.
            fr = f_unlink(path);
            if (fr != FR_OK) break;
        }
        path[--i] = '';
        f_closedir(&dir);
    }
    f_closedir(&dir);
    return fr;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
geliang2008
1楼-- · 2019-07-21 05:34
 精彩回答 2  元偷偷看……
dongyi657
2楼-- · 2019-07-21 07:05
yonhing 发表于 2015-2-11 10:06
我也是用Fatfs的版本是最新的R0.10c , 已经在电脑删上除文件(Delete / Cut),可是在STM32 的SD,还是存在的 ...

两个FAT表看看
dongyi657
3楼-- · 2019-07-21 10:23
 精彩回答 2  元偷偷看……
dongyi657
4楼-- · 2019-07-21 12:03
lvehe 发表于 2014-12-22 08:21
但文件系统为什么会损坏呢?还是没答到点子上

簇链表没有删除干净。SD插到电脑,用windows的cmd输入chkdsk f:f(盘符)可以检测磁盘错误。这种情况都是簇链表丢失。
慢摇1991
5楼-- · 2019-07-21 12:08
这个更新日志里有FATFS各版本中存在的问题,http://elm-chan.org/fsw/ff/updates.txt ,R0.10c也出现楼主的问题。解决方法,复制R0.11里的f_unlink函数过来,然后修改函数里的DEFINE_NAMEBUF; 为DEF_NAMEBUF;即可。
mowenhui
6楼-- · 2019-07-21 13:46
 精彩回答 2  元偷偷看……

一周热门 更多>