最近在搞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字符串第一个字符进行判断??谢谢
|