中级会员
 
- 积分
- 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;
}
这里面不是排除了长文件名吗? |
|