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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。