📄 fat16.c
字号:
send(0x0a);//new line
while(size)
{
//buffer=malloc(512);
if(FAT16_ReadSector(sector+j,buffer))
{
free(buffer);
return 1;
}
if(size<=512)
{
for(i=0;i<size;i++)
{
send(buffer[i]);//output
}
free(buffer);
return 0;//file over
}
else
{
for(i=0;i<512;i++)
{
send(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+(unsigned long)(tempclust-2)*(unsigned long)SectorsPerClust;//reculculate the sector
}
else
free(buffer);
size-=512;
}
}
return 0;
}
// write data to a file
unsigned char FAT16_Write(unsigned int cluster,unsigned char *data1,unsigned long size)
{
//unsigned char buffer[512];
unsigned long sector;
unsigned int i;
for(i=0;i<size;i++)
{
buffer[i]=data1[i];
}
sector=FirstDataSector+(unsigned long)(cluster-2)*(unsigned long)SectorsPerClust;
if(FAT16_WriteSector(sector,buffer))
return 1;//write the data
return 0;
}
//Delete a file
unsigned char FAT16_Delete(unsigned char *dir)
{
// unsigned char *buffer;
// struct direntry *item;
// unsigned int 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)
{
unsigned char *buffer;
struct direntry *item;
unsigned int cluster;
unsigned int 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(unsigned char *dir,unsigned char *newname)
{
unsigned char name[11];
unsigned char *p=dir;
unsigned char deep=0;
unsigned char i,j;
// unsigned char directory=0;
unsigned long cluster=0;
unsigned char *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
}
/*unsigned char Search(unsigned char *dir,unsigned char *ext,unsigned int *buf)
{
unsigned char *buffer;
unsigned char buff[3];
unsigned long sector;
unsigned int cluster;
unsigned long tempclust;
unsigned char cnt;
unsigned int 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+(unsigned long)(tempclust-2)*(unsigned long)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)
{
unsigned char 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;
}
unsigned char Search(unsigned char *dir,struct direntry *MusicInfo,unsigned char *Count,unsigned char *type)//当COUNT为零时,有它带回这个目录下总共有多少首音乐
{ //不为零时有MusicInfo带回第Count首歌的详细文件信息
//unsigned char *buffer;
//unsigned char buff[3];
unsigned long sector;
unsigned int cluster;
unsigned long tempclust;
unsigned char cnt;
unsigned int 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+(unsigned long)(tempclust-2)*(unsigned long)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 + -