FATFS文件管理系统,删除非空文件夹及其自身

这篇博客记录了一个修改后的FRESULTfiledir_delete函数,用于删除指定路径下的所有文件和子文件夹。原程序在删除根目录时返回错误,作者通过增加根目录判断解决了这一问题。程序适用于SD_NAND设备,因初始化后无FAT格式,避免了格式化的繁琐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FRESULT filedir_delete(u8 *path)//删除路径下每一个文件
{
	u8 flag=0;
	FRESULT res;  
    DIR   dir;     /* 文件夹对象 */ //36  bytes  
    FILINFO fno;   /* 文件属性 */   //32  bytes  
    TCHAR file[_MAX_LFN + 2] = {0};  
#if _USE_LFN  
    TCHAR lname[_MAX_LFN + 2] = {0};  
#endif  
      
#if _USE_LFN  
    fno.lfsize = _MAX_LFN;  
    fno.lfname = lname;    //必须赋初值  
#endif  
    //打开文件夹  
    res = f_opendir(&dir, (const TCHAR*)path);  
      
    //持续读取文件夹内容  
    while((res == FR_OK) && (FR_OK == f_readdir(&dir, &fno)))  
    {  
        //若是"."或".."文件夹,跳过  
        if(0 == strlen(fno.fname))          break;      //若读到的文件名为空  
        if(0 == strcmp(fno.fname, "."))     continue;   //若读到的文件名为当前文件夹  
        if(0 == strcmp(fno.fname, ".."))    continue;   //若读到的文件名为上一级文件夹  
          
        memset(file, 0, sizeof(file));  
#if _USE_LFN  
        sprintf((char*)file, "%s/%s", path, (*fno.lfname) ? fno.lfname : fno.fname);  
#else  
        sprintf((char*)file, "%s/%s", path, fno.fname);  
#endif  
		if(strcmp(path,"0:")==0)//目标是根目录
	     {
			flag=1;
		}
        if (fno.fattrib & AM_DIR)  
        {//若是文件夹,递归删除  
            res = filedir_delete(file);			
        }  
        else  
        {//若是文件,直接删除  
            res = f_unlink(file);  
        }  
    }        
    //删除本身  
    if(res == FR_OK)    
		{
			if(flag==1)
			{			
				return res; 
			}   
			else
			{
				res = f_unlink((const TCHAR*)path);
				return res;
			}
		}
}

https://blog.youkuaiyun.com/u011689162/article/details/54586885/

 参考的是上面这位大佬的程序,但是这个大佬的程序在删除根目录时,虽然可以实现目的但是,返回值会显示错误。错误信息为The path name format is invalid。所以在此基础上加了根目录的判断,经试验可以达到既定要求。特此记录。

PS:本人用的是SD_NAND,初始化后没有fat文件的格式,如果初始化后再格式化FAT格式会相对较麻烦所以才想用这种方式删除根目录下的全部文件。

### STM32 FatFS 文件系统 SD 卡库函数使用教程 #### 配置 FatFS 和硬件接口 为了使 FatFS 能够正常工作于 STM32 微控制器并操作 SD 卡,需要完成几个重要的配置: - 修改 `diskio.c` 中的读写函数以适配特定硬件平台上的 SD 卡访问方式。这通常涉及到替换默认实现为通过 SPI 或者 SDIO 接口进行通信的具体代码[^1]。 ```c DSTATUS disk_initialize(BYTE pdrv); DRESULT disk_read(BYTE pdrv, BYTE *buff, LBA_t sector, UINT count); DRESULT disk_write(BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count); DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff); ``` 上述四个函数用于初始化磁盘设备、执行扇区级别的读取/写入以及发送 I/O 控制命令给存储介质。开发者应依据所使用的外设(如 SDIO 或 SPI)编写相应的驱动逻辑来处理这些请求。 #### 功能定制化设置 编辑 `ffconf.h` 来调整 FatFS 的行为特性,比如支持长文件名(`FF_USE_LFN`)等选项。当目标环境不涉及 EXFAT 系统时,可简单地将其设定为 1;而如果确实存在对 EXFAT 支持的需求,则应该指定此参数值为 3。 #### 基本文件与目录管理操作 针对 STM32 上的应用场景而言,除了常规的创建、打开、关闭文件之外,还经常需要用到删除功能来清理不再需要的数据资源,防止因间不足引起的问题。特别是对于那些会持续积累日志或其他临时记录的应用来说尤为重要[^2]。 要移除一个文件夹或单个文件,可以通过如下 API 实现: ```c // 删除文件 "path/to/file.txt" f_unlink("path/to/file.txt"); // 移除名为 "empty_folder" 的空目录 f_rmdir("empty_folder"); ``` 需要注意的是,在尝试删除空目录之前应当先清其内部的内容,即逐一卸载其中所有的子项后再执行 rmdir() 函数调用。 #### FATFS 流程解析及其集成到 HAL 库的方式 FatFS 设计之初就考虑到了跨平台性和灵活性,因此它将应用程序接口同具体的物理层交互分离出来。这意味着即使是在不同的 MCU 架构之间迁移项目也相对容易得多——只需重新定义好底层的存取方法即可保持高层业务逻辑不变。在 STM32 平台上,最终由 HAL 层负责实际发出指令至外部设备,从而实现了抽象层次间的解耦合[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值