一、引出
Fatfs文件系统中存在短文件名和长文件名的概念。当文件名的字符长度短于13个字符时,称为短文件名。当长于13个字符则称为长文件名。
如果不配置Fatfs文件系统的长文件名功能,当遇到短于13个字符文件名的文件时可以正常显示,ke是当遇到文件名比13字符长时,Fatfs就会自动做截断处理,效果如下:
当配置了长文件名功能,当然就可以全部显示了:
二、说明
接触到fatfs文件系统的长文件名,一般是在使用 f_readdir()
这个函数时,这个函数的功能就是获取上一步使用 f_opendir()
打开的文件夹中的内容,包含文件名和文件夹,并将文件信息保存到定义的结构体中,包含文件信息的结构体内容如下:
typedef struct {
DWORD fsize; /* File size */
WORD fdate; /* Last modified date */
WORD ftime; /* Last modified time */
BYTE fattrib; /* Attribute */
TCHAR fname[13]; /* Short file name (8.3 format) */
#if _USE_LFN
TCHAR* lfname; /* Pointer to the LFN buffer */
UINT lfsize; /* Size of LFN buffer in TCHAR */
#endif
} FILINFO;
从这个结构体我们就可以知道,短文件名是保存到fname[13]中的,它本身就是一个数组,可以存放13个字符,因此当不打开支持长文件名的功能或者所有文件的名字长度短于13个字符,我们都不需要去操心,因为文件系统会把名字自动保存到fname[13]中。而长文件名是保存在lfname所指向地址的,它是一个指针,并没有实际的内存空间,因此当我们使用它之前,需要先开辟一个空间,然后让lfname指向它才行,不然会发生内存错误。
如果要支持中文长文件名,还需要添加一个GBK和Unicode编码的互转文件,因为短文件名本来就是GBK编码的,所以不用转。可是长文件名使用的UTF-16编码,这是Unicode的一种编码方式,所以要先转换为GBK才可以使用。(详细连接)Fatfs提供了这个转换文件,名字为cc936.c。
三、配置方法
第一步:
打开ffconf.h文件,把_USE_LFN修改为1。
解释:
0是不打开长文件名功能。
1是使用一个静态内存区来保存长文件名
2是动态分配单片机的STACK中的内存来保存长文件名。
3是动态分配单片机的HEAP的内存来保存长文件名。
第二步:(不需要支持中文,可以跳过)
修改宏定义_CODE_PAGE为936,并添加cc936.c文件。
第三步:
为长文件名开辟内存空间,直接定义一个全局变量即可。
#if _USE_LFN
char lfn[50];
#else
于是配置就完成了。
四、使用
if(f_opendir(&dir,DirName) == FR_OK) //打开路径目录
{
#if _USE_LFN
fno.lfname=lfn;
fno.lfsize = sizeof(lfn);
#endif
while(f_readdir(&dir, &fno) == FR_OK) //读目录中的文件,并保存到fno中
{
printf("sfn:%s,lfn:%s\n",fno.fname,fno.lfname);
if(id>300)break; //文件数超过300,就退出
if(!fno.fname[0]&&!fno.lfname[0]) break; //没有文件了
}
}