fatfs文件系统支持中文长文件名

一、引出

        Fatfs文件系统中存在短文件名和长文件名的概念。当文件名的字符长度短于13个字符时,称为短文件名。当长于13个字符则称为长文件名。

        如果不配置Fatfs文件系统的长文件名功能,当遇到短于13个字符文件名的文件时可以正常显示,ke是当遇到文件名比13字符长时,Fatfs就会自动做截断处理,效果如下:

fatfs文件系统支持中文长文件名_第1张图片

当配置了长文件名功能,当然就可以全部显示了:

fatfs文件系统支持中文长文件名_第2张图片

二、说明

        接触到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。

fatfs文件系统支持中文长文件名_第3张图片

解释:

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;  //没有文件了
        }
    }

 

你可能感兴趣的:(MCU)