⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat16.c

📁 FAT32文件系统的存储机制及其在单片机上的实现,已通过
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -