STM32使用FATFS文件系统删除SD卡中的文件夹
本博客上接STM32利用FATFS文件系统给SD卡读写数据。
STM32开发项目中遇到:配套基于文件系统管理的SD卡在长时间运行下数据占满SD卡而导致系统宕机。这种时候需要对SD卡内存进行管理:对于共性数据文件夹在长期运行下,一些冗余的数据文件、文件夹等需要删除,可以使用文件系统去帮助删除文件夹。
1、删除空文件夹或者文件
如果遇到的删除对象是一个空文件夹或者一个文件(.txt、.dat)时,使用C++官方提供的库函数:f_unlink(path); //path为文件路径或者文件夹路径
2、删除有子文件的文件夹
如果删除对象为一个装有子文件(文件夹、文件等)的文件夹,需要通过循环扫描文件夹中的文件类型然后递归删除。
如果文件夹中的子文件类型为文件夹则需要递归扫描删除文件夹;如果子文件为文件类型则将其直接删除。整个删除文件夹的程序见下方示例程序(亲测,在项目中已实现功能)。此程序从C语言官网网站函数[f_readdir(DIR* dp,FILINFO* fno)]所给样例程序修改而来。
typedef char TCHAR;
FRESULT f_deldir (TCHAR* path)//path为需要删除的文件夹
{
FRESULT res;
res = scan_files_del(path);
return res;
}
FRESULT scan_files_del(TCHAR* path)//递归删除文件
{
FRESULT res;
DIR dir;
UINT i;
static FILINFO fno;
res = f_opendir(&dir, path);//打开此文件夹
if (res == FR_OK){//成功打开文件夹
for (;;){//循环扫描文件夹和文件
res = f_readdir(&dir, &fno);//读取此文件家中的一个子文件
if (res != FR_OK || fno.fname[0] == 0) break;//读取错误或者已经扫描完此文件夹下的所有文件,跳出循环
if (fno.fattrib & AM_DIR) {//子文件为文件夹
i = strlen(path);//统计附文件夹路径长度
sprintf((char*)&path[i], "\\%s", fno.fname);//将子文件夹名加入路径
res = scan_files_del(path);//递归进入子文件夹,扫描文件夹
if (res != FR_OK) break;//操作失败跳出循环
path[i] =0;//文件路径回退
}
else {//子文件为 文件类型
i = strlen(path);//统计附文件夹路径长度
sprintf((char*)&path[i], "\\%s", fno.fname);//将子文件名加入路径
res=f_unlink(path);//删除子文件
path[i] =0;//文件路径回退
}
}
res=f_closedir(&dir);//挂你打开的父文件夹
res=f_unlink(path);//删除已经清空的父文件夹
}
return res;
}