📄 fat.c
字号:
{
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 + -