利用fatfs进行文件管理

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;
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章