一、说明
使用长文件名,一般会是在使用 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); }
|
原文链接:本人CSDN博客