OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5949|回复: 7

删除文件夹!分享一个函数

[复制链接]

70

主题

275

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2017-6-20
在线时间
188 小时
发表于 2017-11-23 15:44:44 | 显示全部楼层 |阅读模式
看了好多朋友用那个f_unlink()函数没法删除还有内容的文件夹,今天在网上找到一个不错的函数,所以拿来跟大家分享一下~废话不多说直接上函数的代码:

/* 删除文件夹内所有的文件和文件夹*/
FRESULT FS_DeleteIntFile(TCHAR* path)
{
UINT i, j;
FRESULT res;
DIR dir;
FILINFO fno;
#if _USE_LFN
fno.lfname = 0; /* Set null pointer because LFN is not needed */
#endif
res = f_opendir(&dir, path);
if (res == FR_OK)
{
for (i = 0; path; i++) ;
path[i++]='/';
for (;;)
{
res = f_readdir(&dir, &fno);
if (res != FR_OK || !fno.fname[0]) break;
if (fno.fname[0] == '.') continue;
j = 0;
do
path[i+j] = fno.fname[j];
while (fno.fname[j++]);
if (fno.fattrib & AM_DIR)
{
res = FS_DeleteIntFile(path);
if (res != FR_OK) break;
}
res = f_unlink(path);
if ((res != FR_OK) && (res != FR_DENIED)) break;
}
path[--i] = '\0';
}
return res;
}


/* 删除此文件夹及内部的文件及文件夹*/
FRESULT FS_DeleteFolderOrFile(TCHAR* path)
{
FRESULT res;

res = FS_DeleteIntFile(path);
if (res == FR_OK)
{
res = f_unlink(path);
}
else if (FR_NO_PATH == res)
{
res = f_unlink(path);
}
return res;
}
首先把这两个函数的定义放在ff.c当中,别忘了在ff.h中声明一下。然后直接调用就行啦
至于怎么用,不用我说了吧~

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-11-23 21:49:34 | 显示全部楼层
回复 支持 反对

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2021-1-5 17:19:52 | 显示全部楼层
批注 2021-01-05 171812.png
要把path改成path
不然会死在这里。



回复 支持 反对

使用道具 举报

17

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2021-2-9
在线时间
36 小时
发表于 2021-7-19 14:56:13 | 显示全部楼层
flyingPiggy 发表于 2021-1-5 17:19
要把path改成path
不然会死在这里。

你好,请问一下我按你这样改还是卡死了怎么办
回复 支持 反对

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2021-8-11 14:59:56 | 显示全部楼层
13554325794 发表于 2021-7-19 14:56
你好,请问一下我按你这样改还是卡死了怎么办

API.zip (6.83 KB, 下载次数: 2)
回复 支持 反对

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2021-8-11 15:02:12 | 显示全部楼层
flyingPiggy 发表于 2021-8-11 14:59
这是我当时的一个F103RC工程,因为是公司的代码,所以其余部分被我删除,就留了FAFTS的API部分。

...

bsp_faftsapi.c里面的文件是和我程序业务相关的,这里面报错的话,直接注释掉就行了。
主要是Faftsapi里面的函数。你可以参考一下。
回复 支持 反对

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2021-8-11 15:06:49 | 显示全部楼层
13554325794 发表于 2021-7-19 14:56
你好,请问一下我按你这样改还是卡死了怎么办
  1. /*
  2. *@Description:
  3.         根据参数删除文件夹以及其内部文件
  4. *@*path:待删除文件夹的路径
  5. *@return:FRESULT
  6. */
  7. FRESULT DeleteDir(char *path)
  8. {
  9.         /*工作区注册*/
  10.         MountInit();
  11.         res_sd = FS_DeleteFolderOrFile(path);
  12.         if(res_sd == FR_OK)
  13.         {
  14.                 printf("删除文件夹%s成功\r\n",path);
  15.         }       
  16.         return res_sd;
  17. }

  18. /*删除文件,被FS_DeleteFolderOrFile调用*/
  19. FRESULT FS_DeleteIntFile(TCHAR* path)
  20. {
  21.         UINT i, j;
  22.         FRESULT res;
  23.         DIR dir;
  24.         FILINFO fno;
  25.         #if _USE_LFN
  26.         fno.lfname = 0; /* Set null pointer because LFN is not needed */
  27.         #endif
  28.         res = f_opendir(&dir, path);
  29.         if (res == FR_OK)
  30.         {
  31.                 for (i = 0;path[i]; i++) ;
  32.                 path[i++]='/';
  33.                 for (;;)
  34.                 {
  35.                         res = f_readdir(&dir, &fno);
  36.                         if (res != FR_OK || !fno.fname[0]) break;
  37.                         if (fno.fname[0] == '.') continue;
  38.                         j = 0;
  39.                         do
  40.                         path[i+j] = fno.fname[j];
  41.                         while (fno.fname[j++]);
  42.                         if (fno.fattrib & AM_DIR)
  43.                         {
  44.                                 res = FS_DeleteIntFile(path);
  45.                                 if (res != FR_OK) break;
  46.                         }
  47.                         res = f_unlink(path);
  48.                         if ((res != FR_OK) && (res != FR_DENIED)) break;
  49.                 }
  50.                 path[--i] = '\0';
  51.         }
  52.         return res;
  53. }

  54. /* 删除此文件夹及内部的文件及文件夹,被DeleteDir调用*/
  55. FRESULT FS_DeleteFolderOrFile(TCHAR* path)
  56. {
  57.         FRESULT res;

  58.         res = FS_DeleteIntFile(path);
  59.         if (res == FR_OK)
  60.         {
  61.                 res = f_unlink(path);
  62.         }
  63.         else if (FR_NO_PATH == res)
  64.         {
  65.                 res = f_unlink(path);
  66.         }
  67.         return res;
  68. }
复制代码
回复 支持 反对

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2021-8-11 15:09:52 | 显示全部楼层
  1. /*
  2. *@Description:
  3.         对FatFs文件系统的API运行结果进行检测
  4.         并且把检测的结果通过串口输出
  5.         仅在调试的时候使用
  6. *@Param1:NULL
  7. *@return:NULL
  8. */

  9. void errortest(u8 _errorcode)
  10. {
  11.         switch(_errorcode)
  12.                 {
  13.                         case FR_NOT_READY:
  14.                                 printf("未检测到SD卡\r\n");
  15.                                 //TFerror();
  16.                                 break;
  17.                         case FR_EXIST:
  18.                                 printf("已存在同名文件\r\n");
  19.                                 break;
  20.                         default:
  21.                                 printf("未知错误 错误代码为:%d\r\n",_errorcode);
  22.                                 break;
  23.                 }       
  24.                 delay_ms(500);
  25. }

  26. /*
  27. *@Description:
  28.         注册工作区并调用errortest(u8 _errorcode)
  29.         在每次使用FatFsAPI之前都要调用
  30.         这个函数会检测TF卡是否存在
  31. *@Param1:NULL
  32. *@return:NULL
  33. */
  34. void MountInit(void)
  35. {
  36.         while(f_mount(&fs,"0:",1) != FR_OK)
  37.         {
  38.                 FRESULT res;
  39.                 u8 errorcode;
  40.                 res = f_mount(&fs,"0:",1);
  41.                 errorcode = res;
  42.                 errortest(errorcode);
  43.                
  44.         }
  45.         if(res_sd == FR_OK)
  46.         {
  47. //                printf("检测到SD卡!!!\r\n");
  48.         }
  49.         else if(res_sd == FR_NO_FILE)
  50.         {
  51. //                printf("文件已清空\r\n");
  52.         }
  53.        
  54. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表