43 printf("%s/%s\r\n", path, fn); //输出文件名
44 /* 可以在这里提取特定格式的文件路径 */
45 }//else
46 } //for
47 }
48 return res;
49 }
scan_files函数用来扫描指定路径下的文件。比如我们设计一个mp3播放器,我们需要提取mp3格式文件,诸如*.txt、*.c文件我们统统不可要的,这时我们就必须扫描路径下所有文件并把*.mp3或*.MP3格式文件提取出来。这里我们提取特定格式文件,而是把所有文件名称都通过串口打印出来。
我们在ffconf.h文件中定义了长文件名称支持(_USE_LFN=2),一般有用到简体中文文件名称的都要长文件名支持。短文件名称是8.3格式,即名称是8个字节,后缀名是3个字节,对于使用英文名称还可以,使用中文名称就很容易长度不够了。使能了长文件名支持后,使用之前需要指定文件名的存储区还有存储区的大小。
接下来就是使用f_opendir函数打开指定的路径。如果路径存在就使用f_readdir函数读取路径下内容,f_readdir函数可以读取路径下的文件或者文件夹,并保存信息到文件信息对象变量内。f_readdir函数有两个形参,第一个参数为指向路径对象变量的指针,第二个参数为指向文件信息对象的指针。f_readdir函数另外一个特性是自动读取下一个文件对象,即循序运行该函数可以读取该路径下的所有文件。所以,在程序中,我们使用for循环让f_readdir函数读取所有文件,并在读取所有文件之后退出循环。
在f_readdir函数成功读取到一个对象时,我们还不清楚它是一个文件还是一个文件夹,此时我们就可以使用文件信息对象变量的文件属性来判断了,如果判断得出是个文件那我们就直接通过串口打印出来就好了。如果是个文件夹,我们就要进入该文件夹扫描,这时就重新调用扫描函数scan_files就可以了,形成一个递归调用结构,只是我们这次用的参数与最开始时候是不同的,现在是使用子文件夹名称。
主函数代码清单 25-13 主函数
1 int main(void)
2 {
3 /* 初始化调试串口,一般为串口1 */
4 Debug_USART_Config();
5 printf("******** 这是一个QSPI FLASH 文件系统实验 *******\r\n");
6 FATFS_LinkDriver(&QSPI_Driver, QSPIPath);
7 //在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化
8 res_flash = f_mount(&fs,"0:",1);
9 if (res_flash!=FR_OK) {
10 printf("!!外部Flash挂载文件系统失败。(%d)\r\n",res_flash);
11 printf("!!可能原因:QSPI Flash初始化不成功。\r\n");
12 while (1);
13 } else {
14 printf("》文件系统挂载成功,可以进行测试\r\n");
15 }
16
17 /* FatFs多项功能测试 */
18 res_flash = miscellaneous();
19
20
21 printf("\n*************** 文件信息获取测试 **************\r\n");
22 res_flash = file_check();
23
24
25 printf("***************** 文件扫描测试 ****************\r\n");
26 strcpy(fpath,"0:");
27 scan_files(fpath);
28
29
30 /* 不再使用文件系统,取消挂载文件系统 */
31 f_mount(NULL,"0:",1);
32
33 /* 操作完成,停机 */
34 while (1) {
35 }
36 }