📄 fat16.c
字号:
for(i=0;i<size;i++)
{
USART_putchar(buffer[i]);//output
}
free(buffer);
return 0;//file over
}
else
{
for(i=0;i<512;i++)
{
USART_putchar(buffer[i]);
}
j++;
if(j==SectorsPerClust)
{
j=0;
free(buffer);
tempclust=FAT16_NextCluster(tempclust);//find the next cluster the data was stored
if(tempclust==0xffff || tempclust==0xfff8)return 1;//error
sector=FirstDataSector+(U32)(tempclust-2)*(U32)SectorsPerClust;//reculculate the sector
}
else free(buffer);
size-=512;
}
}
return 0;
}
// write data to a file
unsigned char FAT16_Write(U16 cluster,unsigned char *data,U32 size)
{
U8 buffer[512];
U32 sector;
U16 i;
for(i=0;i<size;i++)
{
buffer[i]=data[i];
}
sector=FirstDataSector+(U32)(cluster-2)*(U32)SectorsPerClust;
if(FAT16_WriteSector(sector,buffer))return 1;//write the data
return 0;
}
//Delete a file
unsigned char FAT16_Delete(U8 *dir)
{
// U8 *buffer;
// struct direntry *item;
// U16 cluster;
if(FAT16_Open(dir)==0)return 1;//open the file
if(FAT16_DelItem(&FileInfo))return 1;//delete it
return 0;
}
//Delete an item
unsigned char FAT16_DelItem(struct FileInfoStruct *FileInfo)
{
U8 *buffer;
struct direntry *item;
U16 cluster;
U16 tempclust;
buffer=malloc(512);
if(buffer==0)return 1;
if(FAT16_ReadSector(FileInfo->Sector,buffer)){free(buffer);return 1;}
item=(struct direntry *)(&buffer[FileInfo->Offset]);
item->deName[0]=0xe5;//mark it was deleted
if(FAT16_WriteSector(FileInfo->Sector,buffer)){free(buffer);return 1;}
free(buffer);
cluster=FileInfo->StartCluster;
if(FileInfo->Attr & 0x10)//if the item is a folder
{
while(1)
{
while(FAT16_SelectOneItem(cluster,FileInfo)==0)
{
if(FAT16_DelItem(FileInfo))return 1;//nest for deleting folder
}
tempclust=FAT16_NextCluster(cluster);//if the folder contain many item
if(tempclust==1)return 1;
if(FAT16_ModifyFAT(cluster,0))return 1;//release the fat table
cluster=tempclust;
if(cluster == 0xfff8)return 1;//error
if(cluster == 0xffff)break;//the end of the directory
}
}
else// the item is a file
{
while(1)
{
tempclust=FAT16_NextCluster(cluster);//save the next cluster
if(tempclust==1)return 1;
if(FAT16_ModifyFAT(cluster,0))return 1;//delete curent cluster
cluster=tempclust;
//tempclust=FAT16_NextCluster(cluster);
if(cluster == 0xfff8)return 1;//error
if(cluster == 0xffff)break;//the end of the file
}
if(FAT16_ModifyFAT(cluster,0))return 1;//delete the final cluster
}
return 0; //done
}
//Rename a directory or a file
unsigned char FAT16_Rename(U8 *dir,U8 *newname)
{
U8 name[11];
U8 *p=dir;
U8 deep=0;
U8 i,j;
// U8 directory=0;
U32 cluster=0;
U8 *buffer;
struct direntry *item;
if(*p != '\\')return 1;//invalid path
while(*p)
{
if(*p == '\\')
{
deep++;
}
p++;
}
p=dir;
for(i=0;i<deep-1;i++)
{
p++;
for(j=0;j<11;j++)name[j]=0x20;
j=0;
while(*p != '\\')
{
if((*p) >= 'a' && (*p) <= 'z')name[j] = (*p++)-0x20;
else name[j] = *p++;
j++;
}
if(FAT16_FindItem(cluster,name, &FileInfo))return 1;
cluster = FileInfo.StartCluster;
}
p++;
for(j=0;j<11;j++)name[j]=0x20;
j=0;
while((*p != '.') && (*p) )//compatalbe for folder and file
{
if(*p>='a' && *p<='z')name[j]=(*p++)-0x20;
else name[j]=*p++;
j++;
}
j=8;
if(*p == '.')//if it is a file
{
p++;
while(*p)
{
if(*p>='a' && *p<='z')name[j]=(*p++)-0x20;
else name[j]=*p++;
j++;
}
}
//else ;//It is a directory
if(FAT16_FindItem(cluster,name, &FileInfo))return 1;//get the file or directory information
buffer=malloc(512);
if(buffer==0)return 1;
if(FAT16_ReadSector(FileInfo.Sector,buffer)){free(buffer);return 1;}//read the item according the information
item=(struct direntry *)(&buffer[FileInfo.Offset]);
//modify the name
p=newname;
for(j=0;j<11;j++)item->deName[j]=0x20;
j=0;
while((*p != '.') && (*p))
{
if(*p>='a' && *p<='z')item->deName[j]=(*p++)-0x20;
else item->deName[j]=*p++;
j++;
}
j=8;
if(*p == '.')//if it is a file
{
p++;
while(*p)
{
if(*p>='a' && *p<='z')item->deName[j]=(*p++)-0x20;
else item->deName[j]=*p++;
j++;
}
}
if(FAT16_WriteSector(FileInfo.Sector,buffer)){free(buffer);return 1;}//rewrite the item
free(buffer);
return 0;//done
}
/*U8 Search(U8 *dir,U8 *ext,U16 *buf)//查找ext指定的扩展名的文件,最多100个,buff的第101个代表文件个数
{
U8 *buffer;
U8 buff[3];
U32 sector;
U16 cluster;
U32 tempclust;
unsigned char cnt;
U16 offset;
unsigned char i;
struct direntry *item = 0;
//buf[100]=0;
for(i=0;i<3;i++)buff[i]=0x20;
i=0;
while(*ext)
{
if(*ext>0x60 && *ext<0x7b)
buff[i]=*ext - 0x20;
else buff[i]=*ext;
ext++;
i++;
}
i=buf[100];
cluster = FAT16_OpenDir(dir);
if(cluster == 1)return 1;
if(cluster==0)// root directory
{
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<RootDirSectors;cnt++)
{
if(FAT16_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);//pointer convert
//find a valid item and display it
if((item->deName[0] != '.') & (item->deName[0] != 0x00) & (item->deName[0] != 0xe5) & (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == buff[0])&&(item->deExtension[1] == buff[1])&&(item->deExtension[2] == buff[2]))
{
buf[i]=item->deStartCluster;
i++;
buf[100]+=1;
if(i==100){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
}
else//other folders
{
tempclust=cluster;
while(1)
{
sector=FirstDataSector+(U32)(tempclust-2)*(U32)SectorsPerClust;//calculate the actual sector number
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(FAT16_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);
if((item->deName[0] != '.') & (item->deName[0] != 0x00) & (item->deName[0] != 0xe5) & (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == buff[0])&&(item->deExtension[1] == buff[1])&&(item->deExtension[2] == buff[3]))
{
buf[i]=item->deStartCluster;
buf[100]+=1;
i++;
if(i==100){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
tempclust=FAT16_NextCluster(tempclust);//next cluster
if(tempclust == 0xffff)break;
}
}
return 0;
}*/
//复制记录项信息
void CopyDirentruyItem(struct direntry *Desti,struct direntry *Source)
{
U8 i;
for(i=0;i<8;i++)Desti->deName[i] = Source->deName[i];
for(i=0;i<3;i++)Desti->deExtension[i] = Source->deExtension[i];
Desti->deAttributes = Source->deAttributes;
Desti->deLowerCase = Source->deLowerCase;
Desti->deCHundredth = Source->deCHundredth;
for(i=0;i<2;i++)Desti->deCTime[i] = Source->deCTime[i];
for(i=0;i<2;i++)Desti->deCDate[i] = Source->deCDate[i];
for(i=0;i<2;i++)Desti->deADate[i] = Source->deADate[i];
Desti->deHighClust = Source->deHighClust;
for(i=0;i<2;i++)Desti->deMTime[i] = Source->deMTime[i];
for(i=0;i<2;i++)Desti->deMDate[i] = Source->deMDate[i];
Desti->deStartCluster = Source->deStartCluster;
Desti->deFileSize = Source->deFileSize;
}
U8 Search(U8 *dir,struct direntry *MusicInfo,U8 *Count,U8 *type)//当COUNT为零时,有它带回这个目录下总共有多少首音乐
{ //不为零时有MusicInfo带回第Count首歌的详细文件信息
U8 *buffer;
//U8 buff[3];
U32 sector;
U16 cluster;
U32 tempclust;
unsigned char cnt;
U16 offset;
unsigned char i=0;
struct direntry *item = 0;
//buf[100]=0;
//for(i=0;i<3;i++)buff[i]=0x20;
/* i=0;
while(*ext)
{
if(*ext>0x60 && *ext<0x7b)
buff[i]=*ext - 0x20;
else buff[i]=*ext;
ext++;
i++;
}
i=buf[100];*/
cluster = FAT16_OpenDir(dir);
if(cluster == 1)return 1;
if(cluster==0)// root directory
{
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<RootDirSectors;cnt++)
{
if(FAT16_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);//pointer convert
//find a valid item and display it
if((item->deName[0] != '.') & (item->deName[0] != 0x00) & (item->deName[0] != 0xe5) & (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'P')&&(item->deExtension[2] == '3'))
{
CopyDirentruyItem(MusicInfo,item);
*type=1;
i++;
if(i==*Count){free(buffer);return 0;}
}
else if((item->deExtension[0] == 'W')&&(item->deExtension[1] == 'M')&&(item->deExtension[2] == 'A'))
{
CopyDirentruyItem(MusicInfo,item);
*type=2;
i++;
if(i==*Count){free(buffer);return 0;}
}
else if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'I')&&(item->deExtension[2] == 'D'))
{
CopyDirentruyItem(MusicInfo,item);
*type=3;
i++;
if(i==*Count){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
}
else//other folders
{
tempclust=cluster;
while(1)
{
sector=FirstDataSector+(U32)(tempclust-2)*(U32)SectorsPerClust;//calculate the actual sector number
buffer=malloc(512);//apply memory
if(buffer==0)return 1;//if failed
for(cnt=0;cnt<SectorsPerClust;cnt++)
{
if(FAT16_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
for(offset=0;offset<512;offset+=32)
{
item=(struct direntry *)(&buffer[offset]);
if((item->deName[0] != '.') & (item->deName[0] != 0x00) & (item->deName[0] != 0xe5) & (item->deAttributes != 0x0f))
{
if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'P')&&(item->deExtension[2] == '3'))
{
CopyDirentruyItem(MusicInfo,item);
i++;
if(i==*Count){free(buffer);return 0;}
}
else if((item->deExtension[0] == 'W')&&(item->deExtension[1] == 'M')&&(item->deExtension[2] == 'A'))
{
CopyDirentruyItem(MusicInfo,item);
i++;
if(i==*Count){free(buffer);return 0;}
}
else if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'I')&&(item->deExtension[2] == 'D'))
{
CopyDirentruyItem(MusicInfo,item);
i++;
if(i==*Count){free(buffer);return 0;}
}
}
}
}
free(buffer);//release
tempclust=FAT16_NextCluster(tempclust);//next cluster
if(tempclust == 0xffff)break;
}
}
if(*Count==0)*Count=i;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -