1、FILINFO文件状态结构体
FILINFO结构保存有关f_readdir、f_findfirst、f_findnext和f_stat函数检索的对象的信息,它包括6个成员,我们在获取有关文件最近一次修改日期和时间的信息时,主要用到了fdate和ftime这两个成员。
1.1 fdate
fdate存储了修改文件或创建目录时的日期,共16位,包含了年、月、日三部分信息,分别如下所示:
①bit15:9:表示年份。这里的年份是指文件最近一次修改的年份与1980年的差值,如最近一次修改文件是在2020年,那么差值为2020-1980=40,40的二进制是101000,则bit15:9为0101000。
②bit8:5:表示月份(1~12)。1月为0001,12月为1100。
③bit4:0:表示日(1~31)。
1.2 ftime
ftime存储了修改文件或创建目录时的日期,共16位,包含时、分、秒三部分信息,分别如下所示:
①bit15:11:表示时 (0~23)。
②bit10:5:表示分(0~59)。
③bit4:0:表示 秒/ 2 的值 (0~29)。
2、代码
代码关键在于对fdate和ftime的数据处理。
/*定义结构体变量*/
FRESULT result;/* 定义文件函数返回代码结构体 */
FATFS fs;/* 定义文件系统对象结构体 */
FILINFO FileInf;/* 定义文件状态结构体 */
/* 挂载文件系统 */
result = f_mount(FS_SD, &fs); /* 为FatFs模块注册一个工作区 挂载SD卡 */
if (result != FR_OK)
{
printf("挂载文件系统失败 (%d)\r\n", result);
}
result = f_stat("/text2",&FileInf);
if (result != FR_OK)
{
printf("获取文件状态失败 (%d)\r\n", result);
}
printf("日:%d\r\n",FileInf.fdate&0x1F);/* 日 */
printf("月:%d\r\n",(FileInf.fdate&0x1E0)>>5);/* 月 */
printf("年:%d\r\n",((FileInf.fdate&0xFE00)>>9)+1980);/* 年 */
printf("秒:%d\r\n",(FileInf.ftime&0x1F)*2);/* 秒 */
printf("分:%d\r\n",(FileInf.ftime&0x7E0)>>5);/* 分 */
printf("时:%d\r\n",(FileInf.ftime&0xF800)>>11);/* 时 */
printf("%d/%d/%d %d:%d:%d\r\n",((FileInf.fdate&0xFE00)>>9)+1980,(FileInf.fdate&0x1E0)>>5,FileInf.fdate&0x1F,(FileInf.ftime&0xF800)>>11,(FileInf.ftime&0x7E0)>>5,(FileInf.ftime&0x1F)*2);
/* 卸载文件系统 */
f_mount(FS_SD, NULL);
3、结果
读取如下图所示SD卡根目录下text2文件最近一次修改的日期和时间。
用串口显示结果如下图所示:
可见读取结果是正确的。