FATFS删除非空文件夹--删除子文件夹及文件连同其本身

2019-07-20 16:22发布

在使用F407探索者的升级系统文件夹时发现一个问题,原子哥是直接把SD卡SYSTEM文件夹的文件直接复制到W25Q128里面去,这个程序本身没有bug,只是如果SD卡的SYSTEM文件夹的文件有变动,比如增加或者删除了某些文件,此时直接复制过去后,原来W25Q128里面的旧文件依然存在,这就成了垃圾文件了。所以我就想着,应该在复制文件之前把W25Q128的SYSTEM文件夹整个的删除掉,然后再复制过去。但是找了好久没有发现FATFS有能够直接删除非空文件夹的函数,只能是一个个文件夹打开,然后逐个删除文件,然后再把空文件夹再删除.........在网上找了个程序,改了一些,能够在F407上直接用了,希望能给其他朋友带来点帮助。
[mw_shl_code=applescript,true]TCHAR *files;
TCHAR *lname;
//函 数 名 : exf_deldir  
//函数功能 : 移除一个文件夹,包括其本身和其子文件夹,子文件  
//输    入 : const TCHAR *path---指向要移除的空结尾字符串对象的指针  
//输    出 : 无  
//返 回 值 : FR_OK(0):           函数成功   
//           FR_NO_FILE:         无法找到文件或目录   
//           FR_NO_PATH:         无法找到路径   
//           FR_INVALID_NAME:    文件名非法   
//           FR_INVALID_DRIVE:   驱动器号非法   
//           FR_DENIED:          函数由于以下原因被拒绝:   
//               对象属性为只读;  
//               目录下非空;  
//               当前目录。  
//           FR_NOT_READY:       磁盘驱动器无法工作,由于驱动器中没有媒体或其他原因   
//           FR_WRITE_PROTECTED: 媒体写保护   
//           FR_DISK_ERR:        函数失败由于磁盘运行的一个错误   
//           FR_INT_ERR:         函数失败由于一个错误的 FAT 结构或内部错误   
//           FR_NOT_ENABLED:     逻辑驱动器没有工作区   
//           FR_NO_FILESYSTEM:   驱动器上没有合法的 FAT 卷   
//           FR_LOCKED:          函数被拒由于文件共享机制(_FS_SHARE)   
//备    注 : f_deldir 函数用来移除一个文件夹及其子文件夹、子文件,但不能移除已经打开的对象。   
//====================================================================================================  
FRESULT exf_deldir(const TCHAR *path)  
{  
    FRESULT res;  
    DIR   dir;     /* 文件夹对象 */ //36  bytes  
    FILINFO fno;   /* 文件属性 */   //32  bytes
                char pathname[50];
                strcpy(pathname,path);
#if _USE_LFN  
    fno.lfsize = _MAX_LFN;  
    fno.lfname = lname;    //必须赋初值  
#endif  
    //打开文件夹  
    res = f_opendir(&dir, pathname);  
//                printf("dir res:%d ",res);
    //持续读取文件夹内容  
    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(files, 0, _MAX_LFN + 2);  
#if _USE_LFN  
        sprintf((char*)files, "%s/%s", pathname, (*fno.lfname) ? fno.lfname : fno.fname);  
#else  
        sprintf((char*)files, "%s/%s", pathname, fno.fname);  
#endif  
//                        printf("files name:%s ",files);
        if (fno.fattrib & AM_DIR)  
        {//若是文件夹,递归删除                                                 
            res = exf_deldir(files);  
        }  
        else  
        {//若是文件,直接删除  
            res = f_unlink(files);  
        }  
    }     
//                printf("read res:%d,name:%s ",res,pathname);
    //删除本身  
    if(res == FR_OK)    res = f_unlink(pathname);  
//                printf("unlink res:%d ",res);
    return res;  
}[/mw_shl_code]
上面这个是删除文件夹的函数,如果里面有子文件夹会的话,会递归调用它本身来删除,有点绕
下面是用法
[mw_shl_code=applescript,true]#if _USE_LFN  
        lname = (TCHAR *)mymalloc(SRAMIN,_MAX_LFN + 2);
#endif  
          files = (TCHAR *)mymalloc(SRAMIN,_MAX_LFN + 2);  
        exf_deldir("1:/SYSTEM");
#if _USE_LFN
        myfree(SRAMIN,lname);
#endif
        myfree(SRAMIN,files);[/mw_shl_code]

这个是简单的举个用法例子,要想实现原子哥的系统文件夹更新之前先删除W25Q128的SYSTEM文件夹,可以在app_system_update()函数里面,在 f_mkdir((const TCHAR *)APP_SYSTEM_DSTPATH);//强制创建目标文件夹 这个语句之前加上删除函数就好了。
0条回答

一周热门 更多>