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;
}
物联沃分享整理
物联沃-IOTWORD物联网 » STM32使用FATFS文件系统删除SD卡中的文件夹

发表评论