第25章 串行FLASH文件系统FatFs (15)

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 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzsjd.html