FatFs 使用中文长文件名

一、说明

这里写图片描述

使用长文件名,一般会是在使用 f_readdir() 这个函数时碰到,这个函数的功能就是获取上一步使用 f_opendir() 打开的文件夹中的内容,并将文件信息保存到定义的结构体。

结构体内容如下,
这里写图片描述
里面包含有文件大小,上一次修改日期,文件属性,文件名等。可见,普通文件名是存在一个 fname[13] 的数组里的,这就使得长文件名无法正常显示。而长文件名是一个指针,这个指针指向的数组是需要自己定义的。

二、方法

在使用长文件名时,需要更改 ffconf.h 中的宏定义如下,
这里写图片描述

如果需要支持中文则还需要做如下更改,
这里写图片描述

如下内容非常关键:

方式1

使用长文件名时,需要自己添加存储长文件名的 buffer, 所以需要在用户程序中定义如下内容;
这里写图片描述
将文件信息中长文件名指针指向定义的 buffer
这里写图片描述

方式2

也可以直接使用这种方式:
这里写图片描述

效果如下:
这里写图片描述

三、演示代码

附一份示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void scan_files(void)
{
#if _USE_LFN
Fileinfo.lfname = lfn;
Fileinfo.lfsize = sizeof(lfn);
#endif
uint8_t ret;
uint8_t sum = 0;
if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
{
if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK)
{
SD_Error_Handler();
}
else
{
if((ret = f_opendir(&Dir,(const TCHAR *)MUSIC_DIR_PATH)) != FR_OK)
{
printf("ret : %d ",ret);
SD_Error_Handler();
}
else
{
printf("open music dir\n");
for(;;)
{
ret = f_readdir(&Dir,&Fileinfo);
if(ret != FR_OK || Fileinfo.fname[0] == 0)
{
break;//Break on error or end of dir
}
else
{
if(Fileinfo.lfname[0] == 0)
{
printf("lfname : error\n");
}
else
printf("%s\n",Fileinfo.lfname);
}
if(Fileinfo.fattrib & AM_ARC)//is a file?
{
strcpy((char *)filename[sum],(char *)Fileinfo.lfname);
sum++;
}
}
}
}
}
printf("sum : %d \n",sum);
show_filename(sum);
//show_file();
FATFS_UnLinkDriver(SDPath);
}