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;
}
前人栽树,后人乘凉,希望对后人有参考价值。