背景:
在使用Fatfs文件系统的时候,发现文件名一旦超出8.3这格式的时候,就会出现乱码的现象。
分析:
经过查找后发现,8.3格式就是短文件名的命名格式,8是指文件名或目录名的主体部分小于等于8个字符,3是指文件名或目录名的扩展部分小于等于3个字符中间以 . 作为分割,即类似88888888.333类似的文件格式。因此这个bug显然是由于系统长文件名和短文件名造成的。
但是,我们查找了FATFS中的长文件名的配置方法,即配置ffconf.h文件中
#define _USE_LFN 2
#define _MAX_LFN 255
而且我们也在使用到了长文件名的函数里面初始化了fileinfo.lfname和 fileinfo.lfsize,但是还是不起作用。
#if _USE_LFN
static char lfn[_MAX_LFN];
fileinfo.lfname = lfn;
fileinfo.lfsize = sizeof(lfn);
#endif
解决:
经过查找FATFS的API手册发现,官方使用长文件名去读文件目录的时候,会先做如下操作:
#if _USE_LFN
fn = *fno.lfname ? fno.lfname : fno.fname;
#else
fn = fno.fname;
#endif
也就是会判断读出来的fno.lfname是否为真,如果为真就使用fno.lfname,如果不为真就使用fno.fname。
在代码中加上这部分以后,问题得到解决。