这里面不是排除了长文件名吗?
然后我加入了选择长目录项的功能,但是现在找一个文件都提示文件不存在。代码如下:
FileInfoStruct F_Search(u32 cluster,unsigned char *Name,u32 type)
{
DWORD sector;
DWORD tempclust;
unsigned char cnt;
unsigned int offset;
unsigned int i=0;
direntry *item = 0;
winentry *witem=0;
FileInfoStruct FileInfo;
tempclust=cluster;
while(1)
{
sector=fatClustToSect(tempclust);
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(SD_ReadSingleBlock(sector+cnt,fat_buffer))
{
FileInfo.F_StartCluster=0;//读数错误
printf("读数错误\n");
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;//清空长文件名
}else
{
LongNameFlag=1; //表示此目录项是长文件名目录项
witem=(winentry *)(&fat_buffer[offset]);
if((witem->weCnt&0x1f)<=3) //最大支持39个长文件名字符
{
u8 *Buffer; //存储长文件名目录项中的26 Bytes
my_stradd(Buffer,(u8 *)(witem->wePart1));
my_stradd(Buffer,(u8 *)(witem->wePart2));
my_stradd(Buffer,(u8 *)(witem->wePart3));
for(i=(witem->weCnt-1)*26;i<(witem->weCnt)*26;i++)
{
LongNameBuffer=Buffer;
}
printf("长文件名:%s\n",LongNameBuffer);
}
}
}
}
}
tempclust=FAT_NextCluster(tempclust);//查找下一个簇号
if(tempclust==0x0fffffff||tempclust==0x0ffffff8)break;
}
FileInfo.F_StartCluster=0;//读数错误
printf("不存在该文件\n");
return FileInfo;
}