OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3820|回复: 1

fat32的f_feaddir的遍历文件时候的进入文件夹遍历后不能跳出文件夹接着遍历剩下的文件

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-11-7
在线时间
2 小时
发表于 2016-8-22 16:42:45 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 带枪的剑客 于 2016-8-22 16:57 编辑


在调通过f_readdir遍历文件夹下所有文件(也包括子文件夹下面的文件)和文件夹,出现以下两种情况:
1、比如A文件夹有1<2<3<4<5五个文件,创建时间1最早,5最迟(234依次排列),而且35是存放在A的子文件夹B里面;最后的结果是:只能读到并打印1235四个文件,4读不到而且返回码是(0x09 | FR_INVALID_OBJECT,/* (9) The file/directory object is invalid */),下面是运行结果。
mf_scan_files("0:/A")
0:/A/1.txt
0:/A/2.txt
0:/A/B

0:/A/B/3.txt
0:/A/B/5.txt
=0X9;

2、当从根文件夹开始读的时候(如调用mf_scan_files("0:")),会出现如下结果返回码也是(0x09):
mf_scan_files("0:")
0:/System Volume Information

0:/System Volume Information/IndexerVolumeGuid
=0X9;

以上两种是什么原因呢?如何解决?

以下是代码

u8 mf_scan_files(u8 * path)
{
FRESULT res;
int i;        
    char *fn;   /* This function is assuming non-Unicode cfg. */
#if _USE_LFN
         fileinfo.lfsize = _MAX_LFN * 2 + 1;
        fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
#endif                  

    res = f_opendir(&dir,(const TCHAR*)path);
        
    if (res == FR_OK)
         {        
                printf("\r\n");
                while(1)
                {
                res = f_readdir(&dir, &fileinfo);   
                if (res != FR_OK || fileinfo.fname[0] == 0) break;  
              //  if (fileinfo.fname[0] == '.') continue;         
#if _USE_LFN
                fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
#else                                                           
                fn = fileinfo.fname;
#endif                                                               
                 i = strlen((const TCHAR*)path);
                if (fileinfo.fattrib & AM_DIR)
               {                                         
               sprintf(&path[ i], "/%s", fn);
               res = mf_scan_files(path);
               if (res != FR_OK)  break;                                       
                 path [ i] =0;
               } else {
               printf("%s/%s\r\n", path, fn);
              }
               
        }
        f_closedir(&dir);
    }         
        myfree(SRAMIN,fileinfo.lfname);
    return res;         
}

最佳答案

查看完整内容[请看2#楼]

知道了,因为递归里面的fileinfo和dir没有设置成局部变量。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-11-7
在线时间
2 小时
 楼主| 发表于 2016-8-22 16:42:46 | 显示全部楼层
知道了,因为递归里面的fileinfo和dir没有设置成局部变量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表