OpenEdv-开源电子网

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

关于在FAT32中查找一个文件的问题

[复制链接]

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
发表于 2012-8-23 16:57:53 | 显示全部楼层 |阅读模式
在显示汉字这一章中,FileTemp=F_Search(FirstDirClust,(unsigned char *)("SYSTEM"),T_FILE); 这个函数为什么不能这样用,而要用字符串数组???
从心所欲
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-23 17:33:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-8-23 18:10:56 | 显示全部楼层
我在F_Search()的末尾加了一个提示的串口输出语句,

 FileInfo.F_StartCluster=0;//读数错误  
 printf("不存在该文件\n");
 return FileInfo; 
}
然后我运行的时候就出现了这个"不存在该文件"。刚开始我以为是文件名的原因,但是改成数组的形式后,还是同样的错误。请问是什么原因???
从心所欲
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-8-23 18:11:37 | 显示全部楼层
还有(unsigned char *)("SYSTEM")这样用可不可以啊???
从心所欲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-23 18:59:59 | 显示全部楼层
回复【4楼】楚地狂生:
---------------------------------
你这样写是可以的.

你出现错误,那要检查你的SD卡是不是有这个文件,或者SD卡能不能正常识别.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-8-23 19:09:30 | 显示全部楼层
有啊,我是用来测试我编写的支持长文件名的程序,我以为是长文件名不行,我就改成短文件名了。但是还是不行。
查找这个文件夹的语句我是从fontupd.c中的u8 Update_Font(void)中复制过来的。

//测试长文件名功能的函数
u8 LongName_Test()
{
    FileInfoStruct FileTemp;
FileTemp=F_Search(FirstDirClust,(unsigned char *)root_directory[0],T_FILE);
    if(FileTemp.F_StartCluster==0) return 0;   
//Show_Str(60,170,(unsigned char *)FileTemp.F_ShortName,16,0);    //显示长文件名
//Show_Str(60,190,(unsigned char *)FileTemp.F_Name,16,0);  //显示短文件名
printf("短文件名:%s\n",FileTemp.F_ShortName);
printf("长文件名:%s\n",FileTemp.F_Name); 
return 1;
}
这段程序加在fontupd.c中。
从心所欲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-23 23:59:10 | 显示全部楼层
我们的代码原版就支持长文件名啊...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-8-24 11:35:45 | 显示全部楼层
不是在F_Search()函数中if掉了长文件名啊??
你是这样写的: if(不是长文件名) {}
下面就没了啊?
从心所欲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-24 12:14:22 | 显示全部楼层
回复【8楼】楚地狂生:
---------------------------------
哪个实验?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-8-24 15:57:22 | 显示全部楼层
汉字显示实验
从心所欲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-24 17:22:18 | 显示全部楼层
这里没有注释掉长文件名的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
 楼主| 发表于 2012-8-24 22:36:45 | 显示全部楼层
就这个函数啊

//查找系统文件
//在指定目录下,找寻一个指定类型的指定名字的文件
//cluster:文件夹的簇号!!!
//Name:文件的名字
//type:文件类型
//返回值:该文件的详细信息/如果 FileInfo.F_StartCluster=0 则说明此次寻找失败
FileInfoStruct F_Search(u32 cluster,unsigned char *Name,u32 type)
{
DWORD sector;  
DWORD tempclust;
unsigned char cnt;
unsigned int offset;      
direntry *item = 0;   
FileInfoStruct FileInfo;         
if(cluster==0 && FAT32_Enable==0)//FAT16根目录读取
{  
for(cnt=0;cnt<RootDirSectors;cnt++)
{
if(SD_ReadSingleBlock(FirstDirSector+cnt,fat_buffer))
{
FileInfo.F_StartCluster=0;//读数错误 
return FileInfo;   
}
for(offset=0;offset<512;offset+=32)
{
item=(direntry *)(&fat_buffer[offset]);//指针转换
//找到一个可用的文件
if((item->deName[0] != 0x00) && (item->deName[0] != 0xe5))//找到一个合法文件
{    
if(item->deAttributes != AM_LFN)//忽略长文件名  
{      
CopyDirentruyItem(&FileInfo,item);//复制目录项,提取详细信息    
if(FileInfo.F_Type&type)//找到一个合适的类型了
{
   // //printf("File Name:%s\n",FileInfo.F_Name);

//找到了文件,返回这个文件的首簇
if(mystrcmp(Name,FileInfo.F_Name))
{     
return FileInfo; 
}
}    
LongNameFlag=0;//清空长文件名
}
}
}
}    
}else//其他文件夹/FAT32系统
{
tempclust=cluster;
while(1)
{
sector=fatClustToSect(tempclust);
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(SD_ReadSingleBlock(sector+cnt,fat_buffer))
{
FileInfo.F_StartCluster=0;//读数错误 
return FileInfo;   
}
for(offset=0;offset<512;offset+=32)
{
item=(direntry *)(&fat_buffer[offset]);
if((item->deName[0] != 0x00) && (item->deName[0] != 0xe5))
{
if(item->deAttributes != AM_LFN) //忽略长文件名     
{      
CopyDirentruyItem(&FileInfo,item);//复制目录项,提取详细信息   

if(FileInfo.F_Type&type)//找到一个合适的类型了
{ /*    
//printf("F_Info->F_Name:%s\n",FileInfo.F_Name);
//printf("F_Info->F_Type:%d\n",FileInfo.F_Type);
//printf("F_Info->F_Size:%d\n",FileInfo.F_Size);
//printf("F_Info->F_StartClusterH:%x\n",FileInfo.F_StartCluster>>8); 
//printf("F_Info->F_StartClusterL:%x\n\n",FileInfo.F_StartCluster&0xff); */
//找到了文件,返回这个文件的首簇
if(mystrcmp(Name,FileInfo.F_Name))
{  
return FileInfo; 
}
}    
LongNameFlag=0;//清空长文件名
}
}
}
}   
tempclust=FAT_NextCluster(tempclust);//查找下一个簇号
if(tempclust==0x0fffffff||tempclust==0x0ffffff8 ||(FAT32_Enable==0&&tempclust==0xffff))break;
}  
}    
FileInfo.F_StartCluster=0;//读数错误 
return FileInfo;        
}         
这里面不是排除了长文件名吗?
从心所欲
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 12:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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