|
本帖最后由 am3359 于 2018-1-18 17:02 编辑
//我用STM32F407+FATFS+freeRTOS搭建的系统,需要遍历存储器中每个文件夹和文件,常用的办法是递归调用,遍历函数内嵌套自己直到找到每个文件或文件夹。由于目录深度不可控,这个方法有大量的压栈和出栈容易造成栈溢出系统崩溃。
//现采用目录深度可控的非递归方法如下:
#define LEVEL 8 //LEVEL设置大小代表遍历的深度,8就代表8层,内存足够的话可以设置更大些
u8 j,m;
u8 l[LEVEL]; //l[]保存每层文件夹长度,返回上级目录时用
DIR dir_a[LEVEL]; //FATFS使用的目录结构,只有这个比较占内存需要LEVEL*36字节
tbuf[64]; //注意tbuf的大小要能放得下最深的文件名绝对路径
m = 0;
j = 1;
printf("当前目录:\r\n%s:\r\n", tbuf);
while(1) {
if ( j > m ) { //只有搜索子目录时才执行
f_opendir(&dir_a[j-1], (TCHAR*)tbuf);
l[j-1] = strlen((char *)tbuf);
}
m = j;
f_readdir(&dir_a[j-1], &fileinfo); //读取当前目录下的一个文件
if (fileinfo.fname[0] == 0) { //到末尾了,退出
if (j>1) j--; //下个循环进入父目录
else break;
tbuf[l[j-1]] = '\0'; //存储的路径返回上级目录
} else {
sprintf((char *)tbuf,"%s/%s",tbuf,*fileinfo.lfname ? fileinfo.lfname : fileinfo.fname);//搜索到的文件或文件名连接成完整的路径
if (fileinfo.fattrib & AM_DIR) { //是目录
printf("%s [%dD]\r\n", tbuf,j); //打印目录
if (j<8) j++; //下个循环进入子目录
} else {
printf("%s [%dF]\r\n", tbuf,j); //打印文件
tbuf[l[j-1]] = '\0'; //存储的路径返回目录
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|