}
//在簇号cluster下建立一个目录项
//如果FileInfo.F_StartCluster=0 目录项失败
FileInfoStruct F_CreateDir(u32 cluster,u8 *Name,u32 type)
{
FileInfoStruct FileInfo;
direntry *item;
u32 tempclust;
DWORD sector;
u8 cnt=0;
u16 offset;
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)) //寻找一个可分配的目录项
{
Direntry_Init(item,Name,type);
fat_buffer[offset]=(u8 )item;
if(SD_WriteSingleBlock(FirstDirSector+cnt,fat_buffer))
{
FileInfo.F_StartCluster=0;//写入错误
return FileInfo;
}
CopyDirentruyItem(&FileInfo,item);
return FileInfo;
}
}
}
}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)) //寻找一个可分配的目录项
{
Direntry_Init(item,Name,type);
CopyDirentruyItem(&FileInfo,item);
return FileInfo;
}
}
}
tempclust=FAT_NextCluster(tempclust);//查找下一个簇号
if(tempclust==0x0fffffff||tempclust==0x0ffffff8 ||(FAT32_Enable==0&&tempclust==0xffff))break;
}
}
FileInfo.F_StartCluster=0;//发生错误
return FileInfo;
}
//初始化目录项信息
void Direntry_Init(direntry *item,u8 *Name,u32 type)
{
u8 i=0,t;
u32 fcluster;
while(Name[i++]!='.'); //此处进入hardware fault,i没赋初值0,已解决
i--;
for(t=0;t<8;t++)
{
if(t>=i) item->deName[t]=' ';
else item->deName[t]=Name[t];
}
for(t=0;t<3;t++)
{
if(t>((sizeof(Name)-i-1)-1)) item->deExtension[t]=' ';
else item->deExtension[t]=Name[i+1];
}
item->deFileSize=0; //建立一个新文件,无分配空间
if(type==T_FILE)
{
item->deAttributes=AM_DIR; //文件夹
}else if(type==T_FON||type==T_SYS)
{
item->deAttributes=AM_SYS; //系统文件
}
else {
item->deAttributes=AM_ARC; //归档文件
}
fcluster=F_SearchFreeClust();
//if(fcluster ==0||fcluster ==0x0ffffff8) return 0; //在FAT表中寻找一个可用的簇号,
Write_Fat(fcluster,0xfffffff8); //将其写入FileTemp.F_StartClust中,并把当前簇号的内容写为0xfffffff8
item->deHighClust=(WORD)(fcluster>>16);
item->deStartCluster=(WORD)((u16)fcluster);
}