利用FatFs文件系统读取文件最近一次修改日期和时间

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文件最近一次修改的日期和时间。
在这里插入图片描述
用串口显示结果如下图所示:
在这里插入图片描述
可见读取结果是正确的。

猜你喜欢

转载自blog.csdn.net/weixin_42611800/article/details/108014044
今日推荐