?? znfat.c
字號:
}
for(i=0;i<sizeof(struct direntry);i++)
{
znFAT_Buffer[i]=((UINT8 *)(&temp_rec))[i];
}
znFAT_WriteSector(temp_sec,znFAT_Buffer);
}
if(is_dir)
{
znFAT_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++)
{
znFAT_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++)
{
znFAT_Buffer[i]=((UINT8 *)(&temp_rec))[i-sizeof(struct direntry)];
}
for(;i<pArg->BytesPerSector;i++)
{
znFAT_Buffer[i]=0;
}
temp_sec=SOC(new_clu);
znFAT_WriteSector(temp_sec,znFAT_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;
}
znFAT_Find_Free_Clust(1);
return 1;
}
#endif
/**************************************************************************
- 功能描述:向某一個文件追加數(shù)據(jù)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:pfi:指向FileInfoStruct類型的結(jié)構(gòu)體,用于裝載剛創(chuàng)建的文件的信息
len:要追加的數(shù)據(jù)長度
pbuf:指向數(shù)據(jù)緩沖區(qū)的指針
- 返回說明:成功返回實際寫入的數(shù)據(jù)長度,失敗返回0
- 注:追加數(shù)據(jù)失敗很有可能是存儲設備已經(jīng)沒有空間了,也就是找不到空閑簇了
**************************************************************************/
#ifdef ZNFAT_ADD_DAT
UINT32 znFAT_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)
{
znFAT_ReadSector(pfi->Rec_Sec,znFAT_Buffer);
prec=(struct direntry *)(znFAT_Buffer+pfi->nRec);
temp_file_size=LE2BE((prec->deFileSize),4);
if(!temp_file_size)
{
if(!(new_clu=znFAT_Find_Free_Clust(0))) return 0;
znFAT_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;
znFAT_ReadSector(pfi->Rec_Sec,znFAT_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;
znFAT_WriteSector(pfi->Rec_Sec,znFAT_Buffer);
}
else
{
if(!(temp_file_size%(pArg->SectorsPerClust*pArg->BytesPerSector))) //在簇的最末尾臨界地方,需要尋找新簇
{
znFAT_Seek_File(pfi,pfi->FileSize-1);
if(!(new_clu=znFAT_Find_Free_Clust(0))) return 0;
znFAT_Modify_FAT(pfi->FileCurCluster,new_clu);
znFAT_Modify_FAT(new_clu,0x0fffffff);
}
znFAT_Seek_File(pfi,pfi->FileSize);
}
iSec=pfi->FileCurSector;
znFAT_ReadSector(iSec,znFAT_Buffer);
for(i=pfi->FileCurPos;i<pArg->BytesPerSector;i++)
{
znFAT_Buffer[i]=pbuf[counter];
counter++;
if(counter>=len)
{
iSec=pfi->FileCurSector;
goto end;
}
}
znFAT_WriteSector(pfi->FileCurSector,znFAT_Buffer); //數(shù)據(jù)接縫
if(pfi->FileCurSector-(SOC(pfi->FileCurCluster))<(pArg->SectorsPerClust-1)) //判斷是不是一個簇的最后一個扇區(qū),先將當前簇所有扇區(qū)填滿
{
for(iSec=pfi->FileCurSector+1;iSec<=(SOC(pfi->FileCurCluster)+pArg->SectorsPerClust-1);iSec++)
{
for(i=0;i<pArg->BytesPerSector;i++)
{
znFAT_Buffer[i]=pbuf[counter];
counter++;
if(counter>=len)
{
goto end;
}
}
znFAT_WriteSector(iSec,znFAT_Buffer);
}
}
temp_sub=len-counter;
for(iClu=0;iClu<temp_sub/(pArg->SectorsPerClust*pArg->BytesPerSector);iClu++)
{
if(!(new_clu=znFAT_Find_Free_Clust(0))) return 0;
znFAT_Modify_FAT(pfi->FileCurCluster,new_clu);
znFAT_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++)
{
znFAT_Buffer[i]=pbuf[counter];
counter++;
}
znFAT_WriteSector(iSec,znFAT_Buffer);
}
}
temp_sub=len-counter;
if(temp_sub)
{
if(!(new_clu=znFAT_Find_Free_Clust(0))) return 0;
znFAT_Modify_FAT(pfi->FileCurCluster,new_clu);
znFAT_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++)
{
znFAT_Buffer[i]=pbuf[counter];
counter++;
}
znFAT_WriteSector(iSec,znFAT_Buffer);
}
}
temp_sub=len-counter;
if(temp_sub)
{
for(i=0;i<pArg->BytesPerSector;i++)
{
znFAT_Buffer[i]=pbuf[counter];
counter++;
}
znFAT_WriteSector(iSec,znFAT_Buffer);
}
end:
znFAT_WriteSector(iSec,znFAT_Buffer);
znFAT_ReadSector(pfi->Rec_Sec,znFAT_Buffer);
(((struct direntry *)(znFAT_Buffer+pfi->nRec))->deFileSize)[0]=((temp_file_size+len)&0x000000ff);
(((struct direntry *)(znFAT_Buffer+pfi->nRec))->deFileSize)[1]=((temp_file_size+len)&0x0000ff00)>>8;
(((struct direntry *)(znFAT_Buffer+pfi->nRec))->deFileSize)[2]=((temp_file_size+len)&0x00ff0000)>>16;
(((struct direntry *)(znFAT_Buffer+pfi->nRec))->deFileSize)[3]=((temp_file_size+len)&0xff000000)>>24;
znFAT_WriteSector(pfi->Rec_Sec,znFAT_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;
}
znFAT_Find_Free_Clust(1);
return len;
}
#endif
/**************************************************************************
- 功能描述:創(chuàng)建目錄(支持任意層目錄創(chuàng)建)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:pfi:無用
dirpath:目錄路徑 比如 "\\dir1\\dir2\\dir3\\....\\dirn\\"
最后必須是\\結(jié)束
- 返回說明:成功返回0,失敗返回1
- 注:如果中間某一級目錄不存在,比如上面的這個路徑中dir3不存在,那么此函數(shù)會
創(chuàng)建這個目錄,然后再繼續(xù)去創(chuàng)建更深層的目錄
創(chuàng)建目錄失敗有可能是因為存儲設備空間不足
**************************************************************************/
#ifdef ZNFAT_CREATE_DIR
UINT8 znFAT_Create_Dir(CONST INT8 *dirpath,UINT8 *ptd)
{
struct FileInfoStruct *pfi;
while(!znFAT_Enter_Dir(dirpath))
{
if(znFAT_Create_Rec(pfi,temp_dir_cluster,temp_dir_name,1,ptd)==-1)
{
return 1;
}
}
return 0;
}
#endif
/**************************************************************************
- 功能描述:創(chuàng)建文件(支持任意層目錄創(chuàng)建)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:pfi:一個指向FileInfoStruct類型的結(jié)構(gòu)體的指針,用來裝載新創(chuàng)建的
文件信息,因此新創(chuàng)建的文件不用再打開就可以直接來操作
filepath:文件路徑 比如 "\\dir1\\dir2\\dir3\\....\\dirn\\test.txt"
- 返回說明:0:成功 1:文件已存在 2:創(chuàng)建文件目錄失敗 3:創(chuàng)建文件失敗
- 注:如果文件路徑中某一個中間目錄不存在,那么此函數(shù)會創(chuàng)建這個目錄,再繼續(xù)
去創(chuàng)建更深層的目錄,一直到最后把文件創(chuàng)建完成。
創(chuàng)建文件失敗有可能是因為存儲設備空間不足,或是此文件已經(jīng)存在
**************************************************************************/
#ifdef ZNFAT_CREATE_FILE
UINT8 znFAT_Create_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT8 *ptd)
{
if(znFAT_Open_File(pfi,filepath,0,1))
{
if(!znFAT_Create_Dir(filepath,ptd))
{
if(znFAT_Create_Rec(pfi,temp_dir_cluster,temp_dir_name,0,ptd)==-1)
{
return 3;
}
}
else
{
return 2;
}
}
else
{
return 1;
}
return 0;
}
#endif
/**************************************************************************
- 功能描述:刪除文件(支持任意層目錄)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:filepath:文件路徑 比如 "\\dir1\\dir2\\dir3\\....\\dirn\\test.txt"
- 返回說明:1:文件或目錄路徑不存在 0:成功
- 注:刪除后的文件的FAT表中的簇鏈關(guān)系完全被破壞
**************************************************************************/
#ifdef ZNFAT_DEL_FILE
UINT8 znFAT_Del_File(CONST INT8 *filepath)
{
UINT32 cur_clu,next_clu;
struct FileInfoStruct fi;
if(znFAT_Open_File(&fi,filepath,0,1))
{
return 1;
}
znFAT_ReadSector(fi.Rec_Sec,znFAT_Buffer);
*(znFAT_Buffer+fi.nRec)=0xe5;
znFAT_WriteSector(fi.Rec_Sec,znFAT_Buffer);
if(cur_clu=fi.FileStartCluster)
{
if(cur_clu<Search_Last_Usable_Cluster())
znFAT_Update_FSInfo_Last_Clu(cur_clu);
znFAT_Update_FSInfo_Free_Clu(1);
next_clu=znFAT_GetNextCluster(cur_clu);
while(next_clu!=0x0fffffff)
{
znFAT_Update_FSInfo_Free_Clu(1);
znFAT_Modify_FAT(cur_clu,0x00000000);
cur_clu=next_clu;
next_clu=znFAT_GetNextCluster(cur_clu);
}
znFAT_Modify_FAT(cur_clu,0x00000000);
}
return 0;
}
#endif
/************************************************************************** !!!!!!!!!!!!!!!!!!!!!!!!!
- 功能描述:文件拷貝(源文件路徑與目標文件路徑均支持任意深層目錄,并且支持
文件名通配)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:pArg1:是源文件所在的存儲設備的初始參數(shù)結(jié)構(gòu)體的指針
pArg2:是目標文件所在的存儲設備的初始參數(shù)結(jié)構(gòu)體的指針
sfilename:源文件路徑,也就是拷貝操作的數(shù)據(jù)源
tfilename:目標文件路徑,也就是數(shù)據(jù)最終到寫入的文件
比如 "\\dir1\\dir2\\dir3\\....\\dirn\\test.txt"
file_buf:拷貝過程中要用到的數(shù)據(jù)緩沖區(qū),此緩沖區(qū)容量越大,
拷貝速度越快
buf_size:數(shù)據(jù)緩沖區(qū)的大小
- 返回說明:1:目錄文件創(chuàng)建失敗 2:源文件打開打敗 0:成功
- 注:此函數(shù)支持多設備之間的文件拷貝,pArg1與pArg2引入了源存儲設備與目的
存儲設備的初始參數(shù)信息,從而可以同時對兩個存儲設備進行操作。
znFAT 5.01版開始支持多設備,多設備間的相互數(shù)據(jù)拷貝是最典型的應用
**************************************************************************/
#ifdef ZNFAT_XCOPY_FILE
UINT8 znFAT_XCopy_File(struct znFAT_Init_Arg *pArg1,struct znFAT_Init_Arg *pArg2,CONST INT8 *sfilename,CONST INT8 *tfilename,UINT8 *file_buf,UINT32 buf_size,UINT8 *pt)
{
struct FileInfoStruct FileInfo2,FileInfo1;
struct znFAT_Init_Arg *pArg_temp;
UINT32 i;
pArg_temp=pArg; //把pArg原來的指向賦給中間變量
pArg=pArg2;Dev_No=pArg->DEV_No; //標定目標存儲設備
if(znFAT_Create_File(&FileInfo1,tfilename,pt)) return 1; //在目標存儲設備上創(chuàng)建目標文件
pArg=pArg1;Dev_No=pArg->DEV_No; //標定源存儲設備
if(znFAT_Open_File(&FileInfo2,sfilename,0,1)) return 2; //在源存儲設備上打開源文件
for(i=0;i<FileInfo2.FileSize/buf_size;i++)
{
pArg=pArg1;Dev_No=pArg->DEV_No; //標定源存儲設備
znFAT_Read_File(&FileInfo2,i*buf_size,buf_size,file_buf); //讀源存儲設備上的源文件數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)
pArg=pArg2;Dev_No=pArg->DEV_No; //標定目標存儲設備
znFAT_Add_Dat(&FileInfo1,buf_size,file_buf); //將數(shù)據(jù)級沖區(qū)的數(shù)據(jù)寫入到目標文件中
}
pArg=pArg1;Dev_No=pArg->DEV_No; //標定源存儲設備
znFAT_Read_File(&FileInfo2,i*buf_size,FileInfo2.FileSize%buf_size,file_buf);//讀取最后的文件余量
pArg=pArg2;Dev_No=pArg->DEV_No; //標定目標存儲設備
znFAT_Add_Dat(&FileInfo1,FileInfo2.FileSize%buf_size,file_buf); //將最后的余量數(shù)據(jù)寫入到目標文件中
pArg=pArg_temp; //將pArg恢復
return 0;
}
#endif
/************************************************************************** !!!!1111111111111111111
- 功能描述:文件重命名
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:filename:將要重命名的源文件的路徑 如\a.txt
newfilename:目標文件名 如b.txt (注目標文件名是單純的文件名,
不含路徑)
- 返回說明:1:源文件打開打敗 0:成功
- 注:無
**************************************************************************/
#ifdef ZNFAT_RENAME_FILE
UINT8 znFAT_Rename_File(CONST INT8 *filename,CONST INT8 *newfilename)
{
struct FileInfoStruct fi;
UINT8 i=0,j=0;
if(znFAT_Open_File(&fi,filename,0,1)) return 1; //文件打開失敗
znFAT_ReadSector(fi.Rec_Sec,znFAT_Buffer);
for(i=0;i<11;i++) (znFAT_Buffer+fi.nRec)[i]=0x20;
i=0;
while(newfilename[i]!='.')
{
(znFAT_Buffer+fi.nRec)[i]=L2U(newfilename[i]);
i++;
}
i++;
while(newfilename[i])
{
(znFAT_Buffer+fi.nRec+8)[j]=L2U(newfilename[i]);
i++;j++;
}
znFAT_WriteSector(fi.Rec_Sec,znFAT_Buffer);
return 0;
}
#endif
/**************************************************************************
- 功能描述:文件關(guān)閉
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:pfi:指向當前打開的文件的文件信息結(jié)構(gòu)
- 返回說明:0:成功
- 注:無
**************************************************************************/
#ifdef ZNFAT_FILE_CLOSE
UINT8 znFAT_File_Close(struct FileInfoStruct *pfi)
{
UINT16 i=0;
for(i=0;i<sizeof(struct FileInfoStruct);i++)
{
((UINT8 *)pfi)[i]=0;
}
return 0;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -