搜索
bottom↓
回复: 4

关于fatfs sd文件遍历问题

[复制链接]

出0入0汤圆

发表于 2013-4-4 17:30:11 | 显示全部楼层 |阅读模式
各位大哥,小弟我最近在做遍历sd卡文件时,,,读出来的文件名总是不一样,就是只读得出前面几个字符 ,加了长文件名也一样啊   ,,   怎么解决啊,还望各位不吝赐教

这是遍历代码

FRESULT scan_files (char* path)
{
    FRESULT res;
    FILINFO fno;
    DIR dir;
    int i;
    char *fn;
#if _USE_LFN
    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
    fno.lfname = lfn;
    fno.lfsize = sizeof(lfn);
#endif


    res = f_opendir(&dir, path);
    if (res == FR_OK) {
        i = strlen(path);
        for (;;) {
            res = f_readdir(&dir, &fno);
            if (res != FR_OK || fno.fname[0] == 0) break;
            if (fno.fname[0] == '.') continue;
#if _USE_LFN
            fn = *fno.lfname ? fno.lfname : fno.fname;
#else
            fn = fno.fname;
#endif
           // if (fno.fattrib & AM_DIR) {
          //      sprintf(&path[i], "/%s", fn);
            //    res = scan_files(path);
           //     if (res != FR_OK) break;
           //     path[i] = 0;
        //    } else {
         //       printf("%s/%s\n", path, fn);
            }
        }
    }

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入34汤圆

发表于 2013-4-4 18:04:21 | 显示全部楼层
我贴一个我于 2009 年在玩这 FatFs V0.06 版时的文件遍历方式供您参考,程序是很久的东西了,我忘得也差不多了,所以您别找我提问呀! 这会问倒我的,不过我确定这程序是可以正常运作的就是了..
  1. static FRESULT File_Search (char* path)
  2. {
  3.         UCHAR i;
  4.         UINT np;
  5.         DIR dir;
  6.         FRESULT res;               

  7.         if((res = f_opendir(&dir, path)) == FR_OK)
  8.         {
  9.                 np = strlen(path);
  10.                 while(((res = f_readdir(&dir, &finfo)) == FR_OK) && finfo.fname[0] && Stype == NULL)
  11.                 {
  12.                         if(finfo.fattrib & AM_DIR)
  13.                         {       
  14.                                 *(path + np) = '/'; strcpy(path + np + 1, &finfo.fname[0]);
  15.                                 res = File_Search(path);
  16.                                 *(path + np) = '\0';
  17.                                 if(res != FR_OK) break;
  18.                         }
  19.                         else
  20.                         {
  21.                                 for(i = 0;i < 12;i++) name[i] = (BYTE)' ';
  22.                                 i = 0, p = finfo.fname;
  23.                                 while(*p != '.')
  24.                                 {
  25.                                         if(*p >= 'a' && *p <= 'z') name[i] = (*p++) - 0x20;
  26.                                         else name[i] = *p++;
  27.                                         if(++i > 12) break;
  28.                                 }       
  29.                                 i = 8, p++;
  30.                                 while(*p)
  31.                                 {
  32.                                         if(*p >= 'a' && *p <= 'z') name[i] = (*p++) - 0x20;
  33.                                         else name[i] = *p++;
  34.                                         i++;
  35.                                 }
  36.                                 i = Extension();
  37.                                 if(i > NULL)
  38.                                 {
  39.                                         if(++Songs == Plays)
  40.                                         {
  41.                                                 Stype = i;                                       
  42.                                                 i = 0, p = path; while(*p) {name[i] = *p++; if(++i > 128) break;}
  43.                                                 name[i++] = '/';
  44.                                                 p = finfo.fname; while(*p) {name[i] = *p++; if(++i > 136) break;}
  45.                                                 name[i] = NULL;
  46.                                         }
  47.                                 }
  48.                         }
  49.                 }
  50.         }
  51.         return res;
  52. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-4-4 21:00:17 | 显示全部楼层
虽然不行,但还是要谢谢你,,,,,,,也不知道哪里的问题,,长文件名没有问题,         短文件名就读不完整,或者字符顺序颠倒

出0入34汤圆

发表于 2013-4-5 16:21:02 | 显示全部楼层
ele-madman 发表于 2013-4-4 21:00
虽然不行,但还是要谢谢你,,,,,,,也不知道哪里的问题,,长文件名没有问题,         短文件名就读不完整,或者 ...

我当时用这 FatFs V0.06 版时还不支持长档名,所以文件遍历都是以 8.3 文件名来遍历的!

另外我看了一下程序,我好像少附了一个函数,就是我要遍历指定的副文件名的函数程序,我再列出如下,就是只历 VS-1003 能用的副文件名程序就是了,您就...... 参考参考吧!
  1. static BYTE Extension (void)
  2. {
  3.         if(name[0] != '.' && name[0] != 0x00 && name[0] != 0xE5)
  4.         {
  5.                 if(strncmp (name + 8,"MID",3) == 0) return MID;
  6.                 else if(strncmp (name + 8,"MP3",3) == 0) return MP3;
  7.                 else if(strncmp (name + 8,"WAV",3) == 0) return WAV;
  8.                 else if(strncmp (name + 8,"WMA",3) == 0) return WMA;
  9.                 else return NULL;
  10.         }
  11.         else return NULL;
  12. }
复制代码

出0入20汤圆

发表于 2013-4-23 22:04:14 | 显示全部楼层
好东西。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 14:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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