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

📄 fat.c

📁 SD卡调试所用的资料
💻 C
📖 第 1 页 / 共 4 页
字号:
  {
   FAT32_Buffer[i]=((UINT8 *)(&temp_rec))[i]; 
  }
  FAT32_WriteSector(temp_sec,FAT32_Buffer);
 }
 if(is_dir)
 {
  FAT32_Empty_Cluster(new_clu);

  Fill_Rec_Inf(&temp_rec,".",1,ptd);
  (temp_rec.deHighClust)[0]=(new_clu&0x00ff0000)>>16;
  (temp_rec.deHighClust)[1]=(new_clu&0xff000000)>>24;
  (temp_rec.deLowCluster)[0]=(new_clu&0x000000ff);
  (temp_rec.deLowCluster)[1]=(new_clu&0x0000ff00)>>8;
  for(i=0;i<sizeof(struct direntry);i++)
  {
   FAT32_Buffer[i]=((UINT8 *)(&temp_rec))[i]; 
  }
  Fill_Rec_Inf(&temp_rec,"..",1,ptd);
  if(cluster==pArg->FirstDirClust)
  {
   (temp_rec.deHighClust)[0]=0;
   (temp_rec.deHighClust)[1]=0;
   (temp_rec.deLowCluster)[0]=0;
   (temp_rec.deLowCluster)[1]=0;
  }
  else
  {
   (temp_rec.deHighClust)[0]=(cluster&0x00ff0000)>>16;
   (temp_rec.deHighClust)[1]=(cluster&0xff000000)>>24;
   (temp_rec.deLowCluster)[0]=(cluster&0x000000ff);
   (temp_rec.deLowCluster)[1]=(cluster&0x0000ff00)>>8;
  }
    
  for(i=sizeof(struct direntry);i<2*sizeof(struct direntry);i++)
  {
   FAT32_Buffer[i]=((UINT8 *)(&temp_rec))[i-sizeof(struct direntry)]; 
  }
  for(;i<pArg->BytesPerSector;i++)
  {
   FAT32_Buffer[i]=0;
  }		
  temp_sec=SOC(new_clu);
  FAT32_WriteSector(temp_sec,FAT32_Buffer);
 }
 else
 {
  strcpy(pfi->FileName,name);
  pfi->FileStartCluster=0;
  pfi->FileCurCluster=0;
  pfi->FileSize=0;
  pfi->FileCurSector=0;
  pfi->FileCurPos=0;
  pfi->FileCurOffset=0;
  pfi->Rec_Sec=temp_sec;
  pfi->nRec=temp_Rec;

  pfi->FileAttr=temp_rec.deAttributes;
 }
 FAT32_Find_Free_Clust(1);
 return 1;
}
*/
/**************************************************************************
 - 功能描述:向某一个文件追加数据
 - 隶属模块:FAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:pfi:指向FileInfoStruct类型的结构体,用于装载刚创建的文件的信息
             len:要追加的数据长度
             pbuf:指向数据缓冲区的指针
 - 返回说明:成功返回实际写入的数据长度,失败返回0
 - 注:追加数据失败很有可能是存储设备已经没有空间了,也就是找不到空闲簇了
 **************************************************************************/
/*
UINT32 FAT32_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf)
{
 UINT32 i=0,counter=0,iSec,iClu;
 UINT32 temp_sub,temp_file_size,new_clu,temp_sec;
 struct direntry *prec;
 if(len>0)
 {
  FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);
  prec=(struct direntry *)(FAT32_Buffer+pfi->nRec);
  temp_file_size=LE2BE((prec->deFileSize),4);
  if(!temp_file_size)
  {   
   if(!(new_clu=FAT32_Find_Free_Clust(0))) return 0;
   FAT32_Modify_FAT(new_clu,0x0fffffff);
   pfi->FileStartCluster=new_clu;
   pfi->FileCurCluster=pfi->FileStartCluster;
   pfi->FileSize=0;
   pfi->FileCurSector=SOC(pfi->FileCurCluster);
   pfi->FileCurPos=0;
   pfi->FileCurOffset=0;
   FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);
   (prec->deHighClust)[0]=(new_clu&0x00ff0000)>>16;
   (prec->deHighClust)[1]=(new_clu&0xff000000)>>24;
   (prec->deLowCluster)[0]=(new_clu&0x000000ff);
   (prec->deLowCluster)[1]=(new_clu&0x0000ff00)>>8;
   FAT32_WriteSector(pfi->Rec_Sec,FAT32_Buffer);
  }
  else
  {
   if(!(temp_file_size%(pArg->SectorsPerClust*pArg->BytesPerSector))) //在簇的最末尾临界地方,需要寻找新簇
   {
    FAT32_Seek_File(pfi,pfi->FileSize-1);
    if(!(new_clu=FAT32_Find_Free_Clust(0))) return 0;
	FAT32_Modify_FAT(pfi->FileCurCluster,new_clu);
    FAT32_Modify_FAT(new_clu,0x0fffffff);     
   }
   FAT32_Seek_File(pfi,pfi->FileSize);
  }

  iSec=pfi->FileCurSector;

  FAT32_ReadSector(iSec,FAT32_Buffer);
  for(i=pfi->FileCurPos;i<pArg->BytesPerSector;i++)
  {
   FAT32_Buffer[i]=pbuf[counter];
   counter++;
   if(counter>=len) 
   {
    iSec=pfi->FileCurSector;
    goto end;
   }
  }
  FAT32_WriteSector(pfi->FileCurSector,FAT32_Buffer); //数据接缝  
  
  if(pfi->FileCurSector-(SOC(pfi->FileCurCluster))<(pArg->SectorsPerClust-1)) //判断是不是一个簇的最后一个扇区,先将当前簇所有扇区填满 
  {
   for(iSec=pfi->FileCurSector+1;iSec<=(SOC(pfi->FileCurCluster)+pArg->SectorsPerClust-1);iSec++)
   {
    for(i=0;i<pArg->BytesPerSector;i++)
    {
	 FAT32_Buffer[i]=pbuf[counter];
	 counter++;
     if(counter>=len) 
	 {
	  goto end;
	 }
    }
    FAT32_WriteSector(iSec,FAT32_Buffer);
   }
  }
  
  temp_sub=len-counter;
  for(iClu=0;iClu<temp_sub/(pArg->SectorsPerClust*pArg->BytesPerSector);iClu++)
  {
   if(!(new_clu=FAT32_Find_Free_Clust(0))) return 0;
   FAT32_Modify_FAT(pfi->FileCurCluster,new_clu);
   FAT32_Modify_FAT(new_clu,0x0fffffff);
   pfi->FileCurCluster=new_clu;

   temp_sec=SOC(new_clu);
   for(iSec=temp_sec;iSec<temp_sec+pArg->SectorsPerClust;iSec++)
   {
    for(i=0;i<pArg->BytesPerSector;i++)
	{
   	 FAT32_Buffer[i]=pbuf[counter];
	 counter++;
	} 
	FAT32_WriteSector(iSec,FAT32_Buffer);
   }
  }

  temp_sub=len-counter;
  if(temp_sub)
  {
   if(!(new_clu=FAT32_Find_Free_Clust(0))) return 0;
   FAT32_Modify_FAT(pfi->FileCurCluster,new_clu);
   FAT32_Modify_FAT(new_clu,0x0fffffff);
   pfi->FileCurCluster=new_clu;
   temp_sec=SOC(new_clu);
   for(iSec=temp_sec;iSec<temp_sec+temp_sub/pArg->BytesPerSector;iSec++)
   {
    for(i=0;i<pArg->BytesPerSector;i++)
	{
   	 FAT32_Buffer[i]=pbuf[counter];
	 counter++;
	} 
	FAT32_WriteSector(iSec,FAT32_Buffer);    
   }   
  }

  temp_sub=len-counter;
  if(temp_sub)
  {
   for(i=0;i<pArg->BytesPerSector;i++)
   {
   	FAT32_Buffer[i]=pbuf[counter];
	counter++;
   } 
   FAT32_WriteSector(iSec,FAT32_Buffer);   
  }
end:
  FAT32_WriteSector(iSec,FAT32_Buffer);
  FAT32_ReadSector(pfi->Rec_Sec,FAT32_Buffer);
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[0]=((temp_file_size+len)&0x000000ff);
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[1]=((temp_file_size+len)&0x0000ff00)>>8;
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[2]=((temp_file_size+len)&0x00ff0000)>>16;
  (((struct direntry *)(FAT32_Buffer+pfi->nRec))->deFileSize)[3]=((temp_file_size+len)&0xff000000)>>24;
  FAT32_WriteSector(pfi->Rec_Sec,FAT32_Buffer);

  pfi->FileSize=(temp_file_size+len);
  pfi->FileCurSector=(pfi->FileSize%pArg->BytesPerSector)?iSec:iSec+1;
  pfi->FileCurPos=pfi->FileSize%pArg->BytesPerSector;
  pfi->FileCurOffset=pfi->FileSize;
 }
 FAT32_Find_Free_Clust(1);
 return len;
}
*/
/**************************************************************************
 - 功能描述:创建目录(支持任意层目录创建)
 - 隶属模块:znFAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:pfi:无用
             dirpath:目录路径 比如 "\\dir1\\dir2\\dir3\\....\\dirn\\"
             最后必须是\\结束
 - 返回说明:成功返回0,失败返回1
 - 注:如果中间某一级目录不存在,比如上面的这个路径中dir3不存在,那么此函数会
       创建这个目录,然后再继续去创建更深层的目录
       创建目录失败有可能是因为存储设备空间不足
 **************************************************************************/
/*
UINT8 FAT32_Create_Dir(struct FileInfoStruct *pfi,INT8 *dirpath,UINT8 *ptd)
{
 while(!FAT32_Enter_Dir(dirpath))
 {
  if(FAT32_Create_Rec(pfi,temp_dir_cluster,temp_dir_name,1,ptd)==-1)
  {
   return 1;
  }
 }
 return 0;
}
*/
/**************************************************************************
 - 功能描述:创建文件(支持任意层目录创建)
 - 隶属模块:FAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:pfi:一个指向FileInfoStruct类型的结构体的指针,用来装载新创建的
             文件信息,因此新创建的文件不用再打开就可以直接来操作
             filepath:文件路径 比如 "\\dir1\\dir2\\dir3\\....\\dirn\\test.txt"
 - 返回说明:0:成功 1:文件已存在 2:创建文件目录失败 3:创建文件失败
 - 注:如果文件路径中某一个中间目录不存在,那么此函数会创建这个目录,再继续
       去创建更深层的目录,一直到最后把文件创建完成。
       创建文件失败有可能是因为存储设备空间不足,或是此文件已经存在
 **************************************************************************/
/*
UINT8 FAT32_Create_File(struct FileInfoStruct *pfi,INT8 *filepath,UINT8 *ptd)
{
 if(FAT32_Open_File(pfi,filepath,0))
 {
  if(!FAT32_Create_Dir(pfi,filepath,ptd))
  {
   if(FAT32_Create_Rec(pfi,temp_dir_cluster,temp_dir_name,0,ptd)==-1)
   {
    return 3;
   }    
  }
  else
  {
   return 2;   
  }
 }
 else
 {
  return 1;
 }
 return 0;
}
*/
/**************************************************************************
 - 功能描述:删除文件(支持任意层目录)
 - 隶属模块:FAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:filepath:文件路径 比如 "\\dir1\\dir2\\dir3\\....\\dirn\\test.txt"
 - 返回说明:1:文件或目录路径不存在 0:成功
 - 注:删除后的文件的FAT表中的簇链关系完全被破坏
 **************************************************************************/
/*
UINT8 FAT32_Del_File(INT8 *filepath)
{
 UINT32 cur_clu,next_clu;
 struct FileInfoStruct fi;
 
 if(FAT32_Open_File(&fi,filepath,0))
 {
  return 1;
 }
 FAT32_ReadSector(fi.Rec_Sec,FAT32_Buffer);
 *(FAT32_Buffer+fi.nRec)=0xe5;
 FAT32_WriteSector(fi.Rec_Sec,FAT32_Buffer);
 
 if(cur_clu=fi.FileStartCluster)
 {
  if(cur_clu<Search_Last_Usable_Cluster()) 
   FAT32_Update_FSInfo_Last_Clu(cur_clu);
  FAT32_Update_FSInfo_Free_Clu(1);
  next_clu=FAT32_GetNextCluster(cur_clu);
  while(next_clu!=0x0fffffff)
  {
   FAT32_Update_FSInfo_Free_Clu(1);
   FAT32_Modify_FAT(cur_clu,0x00000000);
   cur_clu=next_clu;
   next_clu=FAT32_GetNextCluster(cur_clu);
  }
  FAT32_Modify_FAT(cur_clu,0x00000000);
 }
 return 0;
}
*/
/**************************************************************************
 - 功能描述:文件拷贝(源文件路径与目标文件路径均支持任意深层目录,并且支持
             文件名通配)
 - 隶属模块:FAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:pArg1:是源文件所在的存储设备的初始参数结构体的指针
             pArg2:是目标文件所在的存储设备的初始参数结构体的指针
             sfilename:源文件路径,也就是拷贝操作的数据源
             tfilename:目标文件路径,也就是数据最终到写入的文件
                       比如 "\\dir1\\dir2\\dir3\\....\\dirn\\test.txt" 
             file_buf:拷贝过程中要用到的数据缓冲区,此缓冲区容量越大,
                      拷贝速度越快
             buf_size:数据缓冲区的大小 
 - 返回说明:1:目录文件创建失败 2:源文件打开打败 0:成功
 - 注:此函数支持多设备之间的文件拷贝,pArg1与pArg2引入了源存储设备与目的
       存储设备的初始参数信息,从而可以同时对两个存储设备进行操作。
	   znFAT 5.01版开始支持多设备,多设备间的相互数据拷贝是最典型的应用
 **************************************************************************/
/*
unsigned char FAT32_XCopy_File(struct FAT32_Init_Arg *pArg1,struct FAT32_Init_Arg *pArg2,INT8 *sfilename,INT8 *tfilename,UINT8 *file_buf,UINT32 buf_size,unsigned char *pt)
{
 struct FileInfoStruct FileInfo2,FileInfo1;
 UINT32 i;

 Dev_No=pArg2->DEV_No;
 pArg=pArg2;
 if(FAT32_Create_File(&FileInfo1,tfilename,pt)) return 1;
 Dev_No=pArg1->DEV_No;
 pArg=pArg1;
 if(FAT32_Open_File(&FileInfo2,sfilename,0)) return 2;

 for(i=0;i<FileInfo2.FileSize/buf_size;i++)
 {
  Dev_No=pArg1->DEV_No;
  pArg=pArg1;
  FAT32_Read_File(&FileInfo2,i*buf_size,buf_size,file_buf);
  Dev_No=pArg2->DEV_No;
  pArg=pArg2;
  FAT32_Add_Dat(&FileInfo1,buf_size,file_buf);
 }

 Dev_No=pArg1->DEV_No;
 pArg=pArg1; 
 FAT32_Read_File(&FileInfo2,i*buf_size,FileInfo2.FileSize%buf_size,file_buf);
 Dev_No=pArg2->DEV_No;
 pArg=pArg2;
 FAT32_Add_Dat(&FileInfo1,FileInfo2.FileSize%buf_size,file_buf);

 return 0;
}
*/
/**************************************************************************
 - 功能描述:文件重命名
 - 隶属模块:FAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:filename:将要重命名的源文件的路径 如\a.txt
             newfilename:目标文件名 如b.txt (注目标文件名是单纯的文件名,
			 不含路径)
 - 返回说明:1:源文件打开打败 0:成功
 - 注:无
 **************************************************************************/
/*
UINT8 FAT32_Rename_File(INT8 *filename,INT8 *newfilename)
{
 struct FileInfoStruct fi;
 UINT8 i=0,j=0;
 if(FAT32_Open_File(&fi,filename,0)) return 1; //文件打开失败
 FAT32_ReadSector(fi.Rec_Sec,FAT32_Buffer);
 for(i=0;i<11;i++) (FAT32_Buffer+fi.nRec)[i]=0x20;
 i=0;
 while(newfilename[i]!='.')
 {
  (FAT32_Buffer+fi.nRec)[i]=L2U(newfilename[i]);
  i++;
 }
 i++;
 while(newfilename[i])
 {
  (FAT32_Buffer+fi.nRec+8)[j]=L2U(newfilename[i]);
  i++;j++;
 }
 FAT32_WriteSector(fi.Rec_Sec,FAT32_Buffer);
 return 0;
}
*/
/**************************************************************************
 - 功能描述:文件关闭
 - 隶属模块:FAT文件系统模块
 - 函数属性:外部,使用户使用
 - 参数说明:pfi:指向当前打开的文件的文件信息结构
 - 返回说明:0:成功
 - 注:无
 **************************************************************************/

UINT8 FAT32_File_Close(struct FileInfoStruct *pfi)
{
 UINT16 i=0;							
 for(i=0;i<sizeof(struct FileInfoStruct);i++)
 {
  ((UINT8 *)pfi)[i]=0;
 }
 return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -