你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何用f_unlink删除一个文件夹?

[复制链接]
奏奏奏 提问时间:2017-5-8 19:35 /
最近用STM32F107用SPI方式读写TF卡,
用到了FATFS文件系统
f_mkdir("0:/PHOTO1");                //创建PHOTO文件夹
创建了一个PHOTO1的文件夹
但是现在不知道怎么删除掉这个文件夹

查了一下,用f_unlink函数是没错的
但是试过以下的都不行:
f_unlink("0:/PHOTO1");
f_unlink("/PHOTO1");
f_unlink("PHOTO1");

所以发帖请教。
收藏 1 评论9 发布时间:2017-5-8 19:35

举报

9个回答
eagle0754 回答时间:2017-5-10 08:49:37
对于空文件夹可以这样,但是非空文件夹要遍历删除.

  1. /* 删除文件夹内的所有文件和文件夹 */
  2. FRESULT FS_DeleteIntFile(INT8S* path)
  3. {
  4.     UINT i, j;
  5.     FRESULT res;
  6.     DIR dir;
  7.     FILINFO fno;

  8. #if _USE_LFN
  9.     fno.lfname = 0; /* Set null pointer because LFN is not needed */
  10. #endif
  11.     res = f_opendir(&dir, path);
  12.     if (res == FR_OK)
  13.     {
  14.         for (i = 0; path[i]; i++) ;
  15.         path[i++] = '/';
  16.         for (;;)
  17.         {
  18.             res = f_readdir(&dir, &fno);
  19.             if (res != FR_OK || !fno.fname[0]) break;
  20.             if (fno.fname[0] == '.') continue;
  21.             j = 0;
  22.             do
  23.             path[i+j] = fno.fname[j];
  24.             while (fno.fname[j++]);
  25.             if (fno.fattrib & AM_DIR)
  26.             {
  27.                 res = FS_DeleteIntFile(path);
  28.                 if (res != FR_OK) break;
  29.             }
  30.             res = f_unlink(path);

  31.             if ((res != FR_OK) && (res != FR_DENIED)) break;
  32.         }
  33.         path[--i] = '\0';
  34.     }
  35.    
  36.     return res;
  37. }

  38. /* 删除文件夹或文件 */
  39. FRESULT FS_DeleteFolderOrFile(INT8S* path)
  40. {
  41.     FRESULT res;

  42.     /* 删除此文件夹下的所有文件 */
  43.     res = FS_DeleteIntFile(path);

  44.     if (res == FR_OK)
  45.     {
  46.         /* 删除此文件夹 */
  47.         res = f_unlink(path);
  48.     }
  49.     else if (FR_NO_PATH == res)
  50.     {
  51.         /* 删除此文件 */
  52.         res = f_unlink(path);
  53.     }
  54.    
  55.     return res;
  56. }
复制代码
废鱼 回答时间:2017-5-9 09:47:17
楼主仿真一下看看提示的什么错误,记得先关闭路径:f_closedir
奏奏奏 回答时间:2017-5-9 10:28:19
安 发表于 2017-5-9 09:47
楼主仿真一下看看提示的什么错误,记得先关闭路径:f_closedir

仿真时返回值是FR_DENIED
这个f_closedir函数并没有在ff.c中
奏奏奏 回答时间:2017-5-9 10:43:49
我查了一下,f_unlink()只能删除空文件夹和未打开的文件
我已经在0:/PHOTO1下创建了文件,
所以用这个f_unlink函数删除不了
有没有什么好办法解决?
废鱼 回答时间:2017-5-9 11:25:38
我看了一下,没有其他的函数了。只能自己遍历删除了。
奏奏奏 回答时间:2017-5-10 09:31:42
eagle0754 发表于 2017-5-10 08:49
对于空文件夹可以这样,但是非空文件夹要遍历删除.

感谢你的分享,我先试试
奏奏奏 回答时间:2017-5-10 09:52:52
eagle0754 发表于 2017-5-10 08:49
对于空文件夹可以这样,但是非空文件夹要遍历删除.

这里面的函数的输入形参的数据类型有问题:
这两个函数都是 INT8S* path
而 f_unlink 的输入形参数据类型是 const XCHAR *path
导致编译出错
请问是怎么解决的?
eagle0754 回答时间:2017-5-11 08:42:52
奏奏奏 发表于 2017-5-10 09:52
这里面的函数的输入形参的数据类型有问题:
这两个函数都是 INT8S* path
而 f_unlink 的输入形参数据类型 ...

你把函数输入参数类型改一下就行了,不然就强制转化下了.自已多研究下吧
sennn 回答时间:2020-5-11 10:44:47
eagle0754 发表于 2017-5-10 08:49
对于空文件夹可以这样,但是非空文件夹要遍历删除.

我引用了你这段代码,发现执行到 path[i++] = '/';时会出现Haltfault,是什么问题?

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版