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

2019-07-20 20:37发布

本帖最后由 带枪的剑客 于 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(" ");
                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 ", path, fn);
              }
               
        }
        f_closedir(&dir);
    }         
        myfree(SRAMIN,fileinfo.lfname);
    return res;         
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。