利用fatfs进行文件管理

本文介绍如何使用STM32fatfs库进行文件管理,包括创建基于时间的文件结构、读写文件、管理文件夹及监测剩余内存等关键步骤。

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

STM32 fatfs库进行文件管理

在嵌入式系统开发中,经常需要利用SD卡存储一些系统配置文件、系统log文件。查阅一些资料发现fatfs库有很多例程,而且官方文档也非常清晰,但是仍然会遇到很多。套用天下无贼里的一句台词,21世纪什么最可靠,—记博客最可靠!
废话不多说,开始上干货!利用fatfs,做一个基于时间的文件管理系统。
格式:

  • 根目录下创建项目文件夹,表明你这个文件是干嘛的
  • 在项目文件夹下创建时间文件夹,表明这些文件夹是那一天创建的
  • 在时间文件夹下,创建所要记录的文件
  • 为了确保SD内存不溢出,可以通过管理文件数量,来控制内存占用

开始贴代码

    f_mount(0,&fs); //利用f_mount挂载SD卡
    f_mkdir(file_main_path); //利用f_mkdir创建一个文件夹
    f_mkdir(file_path); //利用f_mkdir创建子文件夹,这里主要是通过file_path实现。
    FileOpenForRD(readme_path, &gfhReadMe); //打开一个文件,如果这个文件不存在就创建,并返回一个文件操作句柄,以便对文件进行写操作
    f_lseek(&gfhReadMe,f_size(&gfhReadMe)); //找到文件结尾
    FileWrite(&gfhReadMe, readme_buf, strlen(readme_buf));//写你想要写入的文件
    f_close(&gfhReadMe);//如果不是一直操作,可以先关闭文件,减少资源占用

以上是一个简单的文件夹及文件的创建以及读写过程,下面将对文件夹进行管理。
为了方便管理和用户需求,我们可以将老的文件夹删除

    f_opendir(&dirs, path);//利用f_opendir打开需要管理的文件夹
    f_readdir(&dirs, &finfo);//利用f_read_dir依次读出文件夹名,并将读出的文件夹名保存下来,通过一些逻辑判断哪些是需要的文件夹,哪些是需要删除的文件夹,因为f_readdir是按字符串大小顺序读的,所以你存下来的文件名也是有一定顺序的,这样对时间判断上就没必要做额外的工作了

    if(FR_OK==f_opendir(&dir, path)){ /*< 文件夹路径存在 */
        while(f_readdir(&dir, &fno) == FR_OK) 
        {
            if(!fno.fname[0]) 
            break;
            if(fno.fname[0]=='.')
            continue;
            memset(temp_path,0,39); /*< 清理缓存区*/
            sprintf(temp_path, "%s/%s",path, fno.fname); //得到文件路径
            res = f_unlink(temp_path); /*< 删除文件 */

        }
        f_unlink(path); /*< 删除文件夹 */
    }
    f_chdir("0:"); //退回到根目录,如果不退回,下次创建文件会导致STM32宕机,系统文档中写f_opendir是随时退出的,有点不靠谱,这个坑调一天,纪念下!

有了上诉操作,就可以保证文件始终处于一个相对稳定的水平,想进一步进行管理,可以利用内存做最安全的管理。
下面贴出读取内存的代码:

static unsigned int Get_SD_Remain_Memery(void)
{
    FATFS *fs = NULL;
    DWORD fre_clust = 0, fre_sect = 0;
    /* Get drive information and free clusters */

    unsigned char res = f_getfree("0", &fre_clust, &fs);

    if (res)
    {
        Printf("failed to get SD memery information, err NO.%u.\n",res);
        return 0;
    }


    /* Get free sectors */
    fre_sect = fre_clust * fs->csize;
    freeCap = fre_sect/2048; // 这里剩余内存就获得了

    /* Print free space in unit of KB _MAX_SS = 512B/sector) */

    Printf("%lu KB available.\n",fre_sect / 2048);
    return 1;
}

前人栽树,后人乘凉,希望对后人有参考价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值