OpenEdv-开源电子网

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

关于FATFS移植实验中的文件遍历函数

[复制链接]

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2013-3-21
在线时间
3 小时
发表于 2013-9-22 08:59:17 | 显示全部楼层 |阅读模式
             最近在搞FATFS的移植应用 关于实验40移植实验,在fattester.c文件中

文件遍历函数(这是例程源代码)

 //遍历文件
 //path:路径
 //返回值:执行结果
u8 mf_scan_files(u8 * path)
{
 FRESULT res;  
    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                                               /* It is a file. */
   printf("%s/", path);//打印路径 
   printf("%s\r\n",  fn);//打印文件名  
  }
    }  
 myfree(SRAMIN,fileinfo.lfname);
    return res;  
}

我在写这个函数的时候,仿照着文档书写如下
/*------------------------------------------------------
 读取指定目录下所有的文件
 说明:
 f_readdir    按顺序读取目录内文件,
 重复调用此函数可读取目录内所有文件;
---------------------------------------------------------*/
void FatReadDirTest(s8 *path)
{
// FRESULT res; /* FatFs 函数通用结果代码 */
 #if _USE_LFN//如果使能支持长文件名 先对下面两项初始化
 fileinfo.lfsize=_MAX_LFN * 2 + 1;//
 fileinfo.lfname=(TCHAR*)FileName;//
 #endif
if(f_opendir(&dir,(const TCHAR*)path) == FR_OK)/* 打开文件夹目录成功,目录信息已经在dir结构体中保存 */
  {                                                
 while(f_readdir(&dir, &fileinfo) == FR_OK)  /* 读文件信息到文件状态结构体中 */
    {                                           
 if(!fileinfo.fname[0]) break; /* 如果文件名为‘\0',说明读取完成结束 */
 printf("%s/",path);//打印路径
 #if _USE_LFN
 printf("文件名:%s\r\n",fileinfo.lfname );//打印信息到串口
 #else
 printf("文件名:%s\r\n", fileinfo.fname);//
 #endif
  }
  }
}

带背景颜色的行是与原子的例程不同之处,如果使能了长文件名。那么直接输出的长文件名字符串,刚开始的时候我用sd卡下的一个文件夹做了测试】
TEXT/文件名:任贤齐 - 心太软.mp3
TEXT/文件名:李小龙劲爆腿法集锦.flv
TEXT/文件名:新建文本文档.txt
TEXT/文件名:继电器
TEXT/文件名:kill.bat
TEXT/文件名:我是.wps
TEXT/文件名:liangronglin.txt
TEXT/文件名:a - 副本.bat

以上是目录下实际的所有文件夹及文件,

但是我的测试结果却是这样
TEXT/文件名:任贤齐 - 心太软.mp3
TEXT/文件名:李小龙劲爆腿法集锦.flv
TEXT/文件名:新建文本文档.txt
TEXT/文件名:继电器
TEXT/文件名:                                              //这个bat文件却没有遍历成功,不显示!!!!
TEXT/文件名:我是.wps
TEXT/文件名:liangronglin.txt
TEXT/文件名:a - 副本.bat

后来用仿真器跟踪才发现,当我遍历到kill.bat文件时

fileinfo.lfname 数组第一个值竟然是0x00!!!!!!

然而fileinfo.fname 数组第一个值却不是0X00!本人新手,对FATFS系统不是很了解,对出现的这种情况感到很匪夷所思,按理讲只要文件名没超出的情况下,这两个数组的字符串应付完全一致才对吧?后来比对原子哥的例程,才发发现原子哥        fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;    

对lfname字符串第一个字符进行了非零判断,然后决定输出的字符串,所以恳请原子哥和大神们解释一下,为什么会出现两个数组不一致的情况?还要对lfname字符串第一个字符进行判断??谢谢

我思故我在
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2013-3-21
在线时间
3 小时
 楼主| 发表于 2013-9-22 10:12:27 | 显示全部楼层
回复【楼主位】liangronglin:
---------------------------------
为啥没人出来说说呢
我思故我在
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-22 20:18:59 | 显示全部楼层
说明kill.bat没有长文件名。只存在短文件名,所以你的输出就是这种情况了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2013-3-21
在线时间
3 小时
 楼主| 发表于 2013-9-25 10:47:04 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
额,原来是这样,,,,,
我思故我在
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 13:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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