初级会员

- 积分
- 162
- 金钱
- 162
- 注册时间
- 2017-11-27
- 在线时间
- 34 小时
|
本帖最后由 不知道起什么 于 2018-8-23 13:59 编辑
由于自己是个刚入职的新手,之前在摆弄原子开发板的时候也没用过SD卡的操作部分,网上相关例程也甚少,憋了几天终于写成了一个“以RTC时间为名保存文件,并且使保存的文件保留7天”的功能。
由于工作的特殊性,只分享大体的思路,代码不能全部粘贴~(委屈嘤..)
移植FATFS文件系统以及配置RTC等就不用说了吧~对应的初始化操作我也相信大家应该比我清楚。
代码中省略了很多东西,有需要的朋友自己思考怎么加入自己需要的操作。
[mw_shl_code=c,true]
//定义相关变量等
const char *ROOTPath = "0:/";
char *RTCFilePath;
char RTCFilePathName[20] = "";
char *OldDataPath;
char OldDataPathName[20] = "0:/";
char OldDataNumPath[20];
char FileName[10][10];
FRESULT res;
DIR fdir;
FILINFO finfo;
[/mw_shl_code]
打开根目录,并对根目录读取目录项:
[mw_shl_code=c,true]
if(f_opendir(&fdir,ROOTPath) == FR_OK)
{
while(1)
{
res = f_readdir(&fdir,&finfo);
if((res != FR_OK) || (finfo.fname[0] == 0))
break;
//接下面的操作
}
}
[/mw_shl_code]
每次读取得到的文件名都使用strncpy函数将文件名finfo.fname取出来赋值给定义好的二维数组内:
[mw_shl_code=c,true]
strncpy(FileName[num],finfo.fname,6);
[/mw_shl_code]
读取目录完成后将数组内的每个文件名使用atol函数转换成整型数:
[mw_shl_code=c,true]
FileDataNum = atol(FileName);
[/mw_shl_code]
利用冒泡对其进行由小到大排序:
[mw_shl_code=c,true]
//BlueBlue~
[/mw_shl_code]
我们取出FileDataNum[1]的值,将其转换成字符串:
[mw_shl_code=c,true]
itoa(FileDataNum[1],OldDataNumPath,10);
[/mw_shl_code]
然后进行使用strcat进行字符串追加,得到路径:
[mw_shl_code=c,true]
strcat(OldDataPathName,OldDataNumPath);
[/mw_shl_code]
每次检查文件时进行删除FileDataNum[1]所代表的文件的操作:
[mw_shl_code=c,true]
f_unlink(OldDataPath);
[/mw_shl_code]
好,到了这里了,开始解释为什么用冒泡排序放到数组里,每一天的日期均以RTC格式存储,例如今天存储的文件名为“180823”,昨天的为“180822”,即每天存储的文件名代表的10进制数都是越来越大的,我利用这个特点,将读取到的每个文件名存储到数组里,进行冒泡排序,数大的排在右面,那最左面代表的就是为旧日期的文件,因为根目录内有一个隐藏的“System Volume Information”系统信息文件夹,他最后在数组内表示的数值为0,所以我们只需要判断FileDataNum[1],将其转变为路径,检查时进行删除操作,即删除了最旧的文件,同时保证了内存卡内每日更新存储一个文件,七天后删除的功能。
补充一下,使用RTC时间进行文件名创建时,我使用了四个函数:snprintf,malloc,memset,strcpy。这样就可以把变化的RTC动态的转变为SD卡内的路径。
这是我目前想到的很简单易懂的方法了,肯定还会有更好的操作,更好的算法,我一个新人还要再多多学习。
希望给像我一样在学习的网友多一条前进的路。(焦工看见要原谅我。 )
|
|