奏奏奏 发表于 2017-5-8 19:35:33

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

最近用STM32F107用SPI方式读写TF卡,
用到了FATFS文件系统
f_mkdir("0:/PHOTO1");                //创建PHOTO文件夹
创建了一个PHOTO1的文件夹
但是现在不知道怎么删除掉这个文件夹

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

所以发帖请教。

eagle0754 发表于 2017-5-10 08:49:37

对于空文件夹可以这样,但是非空文件夹要遍历删除.

/* 删除文件夹内的所有文件和文件夹 */
FRESULT FS_DeleteIntFile(INT8S* 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 = '/';
      for (;;)
      {
            res = f_readdir(&dir, &fno);
            if (res != FR_OK || !fno.fname) break;
            if (fno.fname == '.') continue;
            j = 0;
            do
            path = fno.fname;
            while (fno.fname);
            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(INT8S* 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;
}

发表于 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
对于空文件夹可以这样,但是非空文件夹要遍历删除.

感谢你的分享,我先试试:lol

奏奏奏 发表于 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 = '/';时会出现Haltfault,是什么问题?
页: [1]
查看完整版本: 如何用f_unlink删除一个文件夹?