基于51單片機FAT32文件系統(tǒng)程序
《基于51單片機FAT32文件系統(tǒng)程序》由會員分享,可在線閱讀,更多相關(guān)《基于51單片機FAT32文件系統(tǒng)程序(39頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 基于51單片機FAT32文件系統(tǒng)程序 #ifndef __ZNFAT_H__ #define __ZNFAT_H__ #include "mytype.h" //類型重定義 /*******************************************************/ //znFAT的裁減宏--------------------------------------------------------- //#define ZNFAT_ENTER_DIR //有此宏,函數(shù) znFAT_Enter_Dir() 參與編譯 #define
2、ZNFAT_OPEN_FILE //有此宏,函數(shù) znFAT_Open_File() 參與編譯 //#define ZNFAT_SEEK_FILE //有此宏,函數(shù) znFAT_Seek_File() 參與編譯 //#define ZNFAT_READ_FILE //有此宏,函數(shù) znFAT_Read_File() 參與編譯 //#define ZNFAT_READ_FILEX //有此宏,函數(shù) znFAT_Read_FileX() 參與編譯 //#define ZNFAT_ADD_DAT //有此宏,函數(shù) znFAT_Add_Dat() 參與編譯 //#d
3、efine ZNFAT_CREATE_DIR //有此宏,函數(shù) znFAT_Create_Dir() 參與編譯 //#define ZNFAT_CREATE_FILE //有此宏,函數(shù) znFAT_Create_File() 參與編譯 //#define ZNFAT_DEL_FILE //有此宏,函數(shù) znFAT_Del_File() 參與編譯 //#define ZNFAT_XCOPY_FILE //有此宏,函數(shù) znFAT_XCopy_File() 參與編譯 //#define ZNFAT_RENAME_FILE //有此宏,函數(shù) znFAT_Renam
4、e_File() 參與編譯 //#define ZNFAT_GET_TOTAL_SIZE //有此宏,函數(shù) znFAT_Get_Total_Size() 參與編譯 //#define znFAT_GET_REMAIN_CAP //有此宏,函數(shù) znFAT_Get_Remain_Cap() 參與編譯 #include "cj.h" #include "cj.h" //---------------------------------------------------------------------- #define SOC(c) (((c-pArg->FirstDirC
5、lust)*(pArg->SectorsPerClust))+pArg->FirstDirSector) // 用于計算簇的開始扇區(qū) #define CONST const //設(shè)備表 #define SDCARD 0 //SD卡 #define UDISK 1 //U盤 #define CFCARD 2 //CF卡 #define OTHER 3 //其它 //這里的存儲設(shè)備表,可以靈活擴充,以實現(xiàn)對更多存儲設(shè)備的支持 //------------------------------------------- #define MAKE_FILE_TIME(h,m,s)
6、 ((((unsigned int)h)<<11)+(((unsigned int)m)<<5)+(((unsigned int)s)>>1)) /* 生成指定時分秒的文件時間數(shù)據(jù) */ #define MAKE_FILE_DATE(y,m,d) (((((unsigned int)y)+20)<<9)+(((unsigned int)m)<<5)+((unsigned int)d)) /* 生成指定年月日的文件日期數(shù)據(jù) */ //DPT:分區(qū)記錄結(jié)構(gòu)如下 struct PartRecord { UINT8 Active; //0x80表示此分區(qū)有效 U
7、INT8 StartHead; //分區(qū)的開始磁頭 UINT8 StartCylSect[2];//開始柱面與扇區(qū) UINT8 PartType; //分區(qū)類型 UINT8 EndHead; //分區(qū)的結(jié)束頭 UINT8 EndCylSect[2]; //結(jié)束柱面與扇區(qū) UINT8 StartLBA[4]; //分區(qū)的第一個扇區(qū) UINT8 Size[4]; //分區(qū)的大小 }; //MBR:分區(qū)扇區(qū)(絕對0扇區(qū))定義如下 struct PartSector { UINT8 PartCode[446
8、]; //MBR的引導(dǎo)程序 struct PartRecord Part[4]; //4個分區(qū)記錄 UINT8 BootSectSig0; //55 UINT8 BootSectSig1; //AA }; //znFAT中對BPB的定義如下 一共占用90個字節(jié) struct znFAT_BPB { UINT8 BS_jmpBoot[3]; //跳轉(zhuǎn)指令 offset: 0 UINT8 BS_OEMName[8]; // offset: 3 UINT8 BPB_BytesPerS
9、ec[2];//每扇區(qū)字節(jié)數(shù) offset:11 UINT8 BPB_SecPerClus[1]; //每簇扇區(qū)數(shù) offset:13 UINT8 BPB_RsvdSecCnt[2]; //保留扇區(qū)數(shù)目 offset:14 UINT8 BPB_NumFATs[1]; //此卷中FAT表數(shù) offset:16 UINT8 BPB_RootEntCnt[2]; //znFAT為0 offset:17 UINT8 BPB_TotSec16[2]; //znFAT為0 o
10、ffset:19 UINT8 BPB_Media[1]; //存儲介質(zhì) offset:21 UINT8 BPB_FATSz16[2]; //znFAT為0 offset:22 UINT8 BPB_SecPerTrk[2]; //磁道扇區(qū)數(shù) offset:24 UINT8 BPB_NumHeads[2]; //磁頭數(shù) offset:26 UINT8 BPB_HiddSec[4]; //FAT區(qū)前隱扇區(qū)數(shù) offset:28 UINT8 BPB_Tot
11、Sec32[4]; //該卷總扇區(qū)數(shù) offset:32 UINT8 BPB_FATSz32[4]; //一個FAT表扇區(qū)數(shù) offset:36 UINT8 BPB_ExtFlags[2]; //znFAT特有 offset:40 UINT8 BPB_FSVer[2]; //znFAT特有 offset:42 UINT8 BPB_RootClus[4]; //根目錄簇號 offset:44 UINT8 FSInfo[2]; //保留扇區(qū)FSINFO扇區(qū)
12、數(shù)offset:48 UINT8 BPB_BkBootSec[2]; //通常為6 offset:50 UINT8 BPB_Reserved[12]; //擴展用 offset:52 UINT8 BS_DrvNum[1]; // offset:64 UINT8 BS_Reserved1[1]; // offset:65 UINT8 BS_BootSig[1]; // offset:66
13、 UINT8 BS_VolID[4]; // offset:67 UINT8 BS_FilSysType[11]; // offset:71 UINT8 BS_FilSysType1[8]; //"znFAT " offset:82 }; struct znFAT_FAT_Item { UINT8 Item[4]; }; struct znFAT_FAT { struct znFAT_FAT_Item Items[128]; }; struct dirent
14、ry { UINT8 deName[8]; // 文件名,不足部分以空格補充 UINT8 deExtension[3]; // 擴展名,不足部分以空格補充 UINT8 deAttributes; // 文件屬性 UINT8 deLowerCase; // 0 UINT8 deCHundredth; // 世紀(jì) UINT8 deCTime[2]; // 創(chuàng)建時間 UINT8 deCDate[2]; // 創(chuàng)建日期 UINT8 deADate[2]; // 訪問日期 UINT8 deHighCl
15、ust[2]; // 開始簇的高字 UINT8 deMTime[2]; // 最近的修改時間 UINT8 deMDate[2]; // 最近的修改日期 UINT8 deLowCluster[2]; // 開始簇的低字 UINT8 deFileSize[4]; // 文件大小 }; //znFAT初始化時初始參數(shù)裝入如下結(jié)構(gòu)體中 struct znFAT_Init_Arg { UINT8 DEV_No; UINT8 BPB_Sector_No; //BPB所在扇區(qū)號 UINT32 Total_Size; //磁
16、盤的總?cè)萘? UINT32 FirstDirClust; //根目錄的開始簇 UINT32 BytesPerSector; //每個扇區(qū)的字節(jié)數(shù) UINT32 FATsectors; //FAT表所占扇區(qū)數(shù) UINT32 SectorsPerClust; //每簇的扇區(qū)數(shù) UINT32 FirstFATSector; //第一個FAT表所在扇區(qū) UINT32 FirstDirSector; //第一個目錄所在扇區(qū) }; struct Date { UINT16 year; UINT8 month; UINT8 day; };
17、 struct Time { UINT8 hour; UINT8 min; UINT8 sec; }; struct FileInfoStruct { UINT8 FileName[15]; //文件名 UINT32 FileStartCluster; //文件的開始簇 UINT32 FileCurCluster; //文件的當(dāng)前簇 UINT32 FileSize; //文件大小 UINT32 FileCurSector; //文件的當(dāng)前扇區(qū) UINT16 FileCurPos; //
18、文件在當(dāng)前扇區(qū)中的位置 UINT32 FileCurOffset; //文件的當(dāng)前偏移量 UINT32 Rec_Sec; //文件的文件/目錄項所在的扇區(qū) UINT16 nRec; //文件的文件/目錄項所在扇區(qū)中的位置 UINT8 FileAttr; //文件屬性 struct Time FileCreateTime; //文件的創(chuàng)建時間 struct Date FileCreateDate; //文件的創(chuàng)建日期 struct Time FileM
19、Time; //文件的修改時間 struct Date FileMDate; //文件的修改日期 struct Date FileADate; //文件的訪問日期 }; struct FSInfo //znFAT的文件系統(tǒng)信息結(jié)構(gòu) { UINT8 Head[4]; UINT8 Resv1[480]; UINT8 Sign[4]; UINT8 Free_Cluster[4]; UINT8 Last_Cluster[4]; UINT8 Resv2[14]; UINT8 Tail[2]; };
20、 extern struct znFAT_Init_Arg *pArg; //初始化參數(shù)結(jié)構(gòu)體指針,用以指向某一存儲設(shè)備的初始化參數(shù)結(jié)構(gòu)體,由外部提供 extern UINT8 Dev_No;//設(shè)備號,外部變量 //函數(shù)聲明 void znFAT_Device_Init(); UINT32 znFAT_Get_Total_Size(void); //獲取總?cè)萘? UINT32 znFAT_Get_Remain_Cap(void); //獲取剩余容量 void znFAT_Init(void); //文件系統(tǒng)初始化 UINT32 znFAT_Enter_Dir(CONST INT
21、8 *path); //進(jìn)入目錄 UINT8 znFAT_Open_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT32 item,UINT8 is_file); //打開文件,支持通配 UINT8 znFAT_Seek_File(struct FileInfoStruct *pfi,UINT32 offset); //文件定位 UINT32 znFAT_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf); //讀取文件數(shù)據(jù)
22、 UINT32 znFAT_Read_FileX(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,void (*pfun)(UINT8)); //讀取文件數(shù)據(jù)并進(jìn)行數(shù)據(jù)處理 UINT32 znFAT_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf); //向文件追加數(shù)據(jù) UINT8 znFAT_Create_Dir(CONST INT8 *dirpath,UINT8 *ptd); //創(chuàng)建目錄,支持創(chuàng)建時間 UINT8 znFAT_Create_File(stru
23、ct FileInfoStruct *pfi,CONST INT8 *filepath,UINT8 *ptd); //創(chuàng)建文件,支持創(chuàng)建時間 UINT8 znFAT_Del_File(CONST INT8 *filepath); //刪除文件 unsigned char 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,unsigned ch
24、ar *pt); //文件拷貝,支持多設(shè)備中文件互拷 UINT8 znFAT_File_Close(struct FileInfoStruct *pfi); //文件關(guān)閉 UINT8 znFAT_Rename_File(CONST INT8 *filename,CONST INT8 *newfilename); //文件重命名 #endif #include "znfat.h" #include "sd.h" //存儲設(shè)備的扇區(qū)讀寫驅(qū)動,這里是SD卡 //#include "ch375.h" //存儲設(shè)備的扇區(qū)讀寫驅(qū)動,這里是U盤 //#include
25、 "cf.h" //存儲設(shè)備的扇區(qū)讀寫驅(qū)動,這里是CF盤 #include "string.h" //全局變量定義 struct direntry temp_rec; INT8 temp_dir_name[13]; UINT32 temp_dir_cluster; UINT32 temp_last_cluster; UINT8 znFAT_Buffer[512]; //扇區(qū)數(shù)據(jù)讀寫緩沖區(qū),由外部提供 /****************************************************************** - 功能描述:znFAT的存儲設(shè)
26、備初始化函數(shù) - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:外部(用于對存儲設(shè)備進(jìn)行初始化) - 參數(shù)說明:無 - 返回說明:無 - 注:在調(diào)znFAT其它函數(shù)之前,必須先對存儲設(shè)備進(jìn)行成功的初始化。 ******************************************************************/ void znFAT_Device_Init() { SD_Reset(); SD_Init(); } /******************************************************
27、************ - 功能描述:znFAT的存儲設(shè)備底層驅(qū)動接口,讀取存儲設(shè)備的addr扇區(qū)的 512個字節(jié)的數(shù)據(jù)放入buf數(shù)據(jù)緩沖區(qū)中 - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:內(nèi)部(用于與存儲設(shè)備的底層驅(qū)動對接) - 參數(shù)說明:addr:扇區(qū)地址 buf:指向數(shù)據(jù)緩沖區(qū)的指針 - 返回說明:0表示讀取扇區(qū)成功,否則失敗 - 注:這里加入了天狼星精華板上的三種存儲設(shè)備,即SD卡(有效)、U盤、 CF卡通過在程序中動態(tài)的切換不同的設(shè)備驅(qū)動,從而實現(xiàn)多設(shè)備(即同 時對多種存
28、儲設(shè)備進(jìn)行操作,比如從SD卡拷貝文件到U盤等等),不同 驅(qū)動的切換,只需要在程序中改變Dev_No這個全局變量的值即可 ******************************************************************/ UINT8 znFAT_ReadSector(UINT32 addr,UINT8 *buf) { switch(Dev_No) //由Dev_No來決定所使用的存儲設(shè)備驅(qū)動 { case SDCARD: return SD_Read_Sector(addr,buf);
29、break; case UDISK: //return CH375_Read_Sector(addr,buf); break; case CFCARD: //return CF_Read_Sector(addr,buf); break; case OTHER: //return XXX_Read_Sector(addr,buf); break; } } /************************************************
30、****************** - 功能描述:znFAT的存儲設(shè)備底層驅(qū)動接口,將buf數(shù)據(jù)緩沖區(qū)中的512個 字節(jié)的數(shù)據(jù)寫入到存儲設(shè)備的addr扇區(qū)中 - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:內(nèi)部(用于與存儲設(shè)備的底層驅(qū)動對接) - 參數(shù)說明:addr:扇區(qū)地址 buf:指向數(shù)據(jù)緩沖區(qū) - 返回說明:0表示讀取扇區(qū)成功,否則失敗 - 注:略 ******************************************************************/ UINT8 z
31、nFAT_WriteSector(UINT32 addr,UINT8 *buf) { switch(Dev_No) //由Dev_No來決定所使用的存儲設(shè)備驅(qū)動 { case SDCARD: return SD_Write_Sector(addr,buf); break; case UDISK: //return CH375_Write_Sector(addr,buf); break; case CFCARD: //return CF_WriteSector(addr
32、,buf); break; case OTHER: //return XXX_Write_Sector(addr,buf); break; } } /****************************************************************** - 功能描述:小端轉(zhuǎn)大端,即LittleEndian車BigEndian - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:內(nèi)部 - 參數(shù)說明:dat:指向要轉(zhuǎn)為大端的字節(jié)序列 len:要轉(zhuǎn)為大端
33、的字節(jié)序列長度 - 返回說明:轉(zhuǎn)為大端模式后,字節(jié)序列所表達(dá)的數(shù)據(jù) - 注:比如:小端模式的 0x33 0x22 0x11 0x00 (低字節(jié)在前) 轉(zhuǎn)為大端模式后為 0x00 0x11 0x22 0x33 (高字節(jié)在前) 所表達(dá)的數(shù)值為 0x00112233 (CISC的CPU通常是小端的,所以znFAT也設(shè)計為小端,而單片機 這種RISC的CPU,通常來說都是大端的,所以需要這個函數(shù)將字 節(jié)的存放次序進(jìn)行調(diào)整,才能得到正
34、確的數(shù)值)
******************************************************************/
UINT32 LE2BE(UINT8 *dat,UINT8 len)
{
UINT32 temp=0;
UINT32 fact=1;
UINT8 i=0;
for(i=0;i 35、***********************************************
- 功能描述:清空某個簇的所有扇區(qū),填充0
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:cluster:要清空的簇的簇號
- 返回說明:無
**************************************************************************/
#ifdef ZNFAT_EMPTY_CLUSTER
void znFAT_Empty_Cluster(UINT32 Cluster)
{
UINT3 36、2 iSec;
UINT16 i;
for(i=0;i 37、描述:獲取剩余容量
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:無
- 返回說明:剩余容量,單位字節(jié)
- 注:從FSInfo中讀取空閑簇數(shù),而從計算得到剩余的容量,單位字節(jié)
***********************************************************************/
#ifdef znFAT_GET_REMAIN_CAP
UINT32 znFAT_Get_Remain_Cap(void)
{
znFAT_ReadSector(1+pArg->BPB_Sector 38、_No,znFAT_Buffer);
if(((struct FSInfo *)znFAT_Buffer)->Free_Cluster[0]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[1]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[2]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[3]==0xff)
return pArg->Total_Size;
else
r 39、eturn LE2BE(((struct FSInfo *)znFAT_Buffer)->Free_Cluster,4)*pArg->SectorsPerClust*pArg->BytesPerSector;
}
#endif
/******************************************************************
- 功能描述:將小字字符轉(zhuǎn)為大寫
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:c:要轉(zhuǎn)換為大寫的字符
- 返回說明:要轉(zhuǎn)換的字節(jié)的相應(yīng)的大寫字符
- 40、 注:只對小寫字符有效,如果不是a~z的小寫字符,將直接返回
******************************************************************/
INT8 L2U(INT8 c)
{
if(c>=a && c<=z) return c+A-a;
else return c;
}
/***********************************************************************
- 功能描述:得到DBR所在的扇區(qū)號(如果沒有MBR,則DBR就在0扇區(qū))
- 隸屬模塊: 41、znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:無
- 返回說明:DBR的扇區(qū)地址
- 注:DBR中包含了很多有用的參數(shù)信息,因此正確定位DBR扇區(qū)的位置,是極為
重要的,后面將有專門的函數(shù)對DBR進(jìn)行解析,正確解析DBR是實現(xiàn)znFAT的
基礎(chǔ)
***********************************************************************/
UINT16 znFAT_Find_DBR(void)
{
UINT16 sec_dbr;
znFAT_ReadSecto 42、r(0,znFAT_Buffer);
if(znFAT_Buffer[0]!=0xeb)
{
sec_dbr=LE2BE(((((struct PartSector *)(znFAT_Buffer))->Part[0]).StartLBA),4);
}
else
{
sec_dbr=0;
}
return sec_dbr;
}
/***********************************************************************
- 功能描述:獲取分區(qū)的總?cè)萘?
- 隸屬模塊:znFAT文件系統(tǒng)模塊
43、
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:無
- 返回說明:分區(qū)容量值,單位為字節(jié)
- 注:這里得到的總?cè)萘渴莦nFAT分區(qū)的容量,一定小于實際的物理容量
***********************************************************************/
#ifdef ZNFAT_GET_TOTAL_SIZE
UINT32 znFAT_Get_Total_Size(void)
{
return pArg->Total_Size;
}
#endif
/********************** 44、*************************************************
- 功能描述:讀取FSInfo獲取最近的一個可用空閑簇
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:無
- 返回說明:最近的一個可用空閑簇
- 注:znFAT中的FSInfo扇區(qū)(絕對1扇區(qū))中記錄了最近的一個可用空閑簇
***********************************************************************/
UINT32 Search_Last_Usable_Clus 45、ter(void)
{
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
return LE2BE(((struct FSInfo *)znFAT_Buffer)->Last_Cluster,4);
}
/***********************************************************************
- 功能描述:znFAT文件系統(tǒng)初始化
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:znFAT_Init_Arg類型的結(jié)構(gòu) 46、體指針,用于裝載一些重要的參數(shù)信息,
以備后面使用
- 返回說明:無
- 注:在使用znFAT前,這個函數(shù)是必須先被調(diào)用的,將很多參數(shù)信息裝入到
arg指向的結(jié)構(gòu)體中,比如扇區(qū)大小、根目錄的位置、FAT表大小等等。
這些參數(shù)絕大部分是來自于DBR的BPB中,因此此函數(shù)主要在作對DBR的參數(shù)解析
***********************************************************************/
void znFAT_Init(void)
{
struct znF 47、AT_BPB *bpb;
bpb=(struct znFAT_BPB *)(znFAT_Buffer); //將數(shù)據(jù)緩沖區(qū)指針轉(zhuǎn)為struct znFAT_BPB 型指針
pArg->DEV_No=Dev_No; //裝入設(shè)備號
pArg->BPB_Sector_No =znFAT_Find_DBR(); //znFAT_FindBPB()可以返回BPB所在的扇區(qū)號
znFAT_ReadSector(pArg->BPB_Sector_No,znFAT_Buffer);
pArg->FATsector 48、s =LE2BE((bpb->BPB_FATSz32) ,4);//裝入FAT表占用的扇區(qū)數(shù)到FATsectors中
pArg->FirstDirClust =LE2BE((bpb->BPB_RootClus) ,4);//裝入根目錄簇號到FirstDirClust中
pArg->BytesPerSector =LE2BE((bpb->BPB_BytesPerSec),2);//裝入每扇區(qū)字節(jié)數(shù)到BytesPerSector中
pArg->SectorsPerClust =LE2BE((bpb->BPB_SecPerClus) ,1);//裝入每簇扇區(qū)數(shù)到 49、SectorsPerClust 中
pArg->FirstFATSector =LE2BE((bpb->BPB_RsvdSecCnt) ,2)+pArg->BPB_Sector_No;//裝入第一個FAT表扇區(qū)號到FirstFATSector 中
pArg->FirstDirSector =(pArg->FirstFATSector)+(bpb->BPB_NumFATs[0])*(pArg->FATsectors); //裝入第一個目錄扇區(qū)到FirstDirSector中
pArg->Total_Size =LE2BE((bpb->BPB_TotSec32),4) 50、*pArg->BytesPerSector; //磁盤的總?cè)萘?,單位是字?jié)
temp_last_cluster=Search_Last_Usable_Cluster();
}
/***********************************************************************
- 功能描述:更新FSInfo中的可用空閑簇的數(shù)量
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:PlusOrMinus:可用空閑簇數(shù)加1或減1
- 返回說明:無
- 注:創(chuàng)建文件、追加數(shù) 51、據(jù)、刪除文件等操作都可能會使可用的空閑簇數(shù)變化
要及時更新
***********************************************************************/
#ifdef ZNFAT_UPDATE_FSINFO_FREE_CLU
void znFAT_Update_FSInfo_Free_Clu(UINT32 PlusOrMinus)
{
UINT32 Free_Clu=0;
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
Free_Clu= 52、(znFAT_Get_Remain_Cap())/(pArg->SectorsPerClust*pArg->BytesPerSector);
if(PlusOrMinus) Free_Clu++;
else Free_Clu--;
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[0]=Free_Clu&0x000000ff;//((UINT8 *)&Free_Clu)[0];
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[1]=(Free_Clu&0x0000ff00)>>8;/ 53、/((UINT8 *)&Free_Clu)[1];
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[2]=(Free_Clu&0x00ff0000)>>16;//((UINT8 *)&Free_Clu)[2];
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[3]=(Free_Clu&0xff000000)>>24;//((UINT8 *)&Free_Clu)[3];
znFAT_WriteSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
}
54、#endif
/***********************************************************************
- 功能描述:更新FSInfo中的下一個可用空閑簇的簇號
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:Last_Clu:將要更新到FSInfo中的下一個可用空閑簇的簇號
- 返回說明:無
- 注:FSInfo中的下一個可用空閑簇號可以給文件系統(tǒng)一個參考,直接告訴文件系統(tǒng)
下一個可用的空閑簇在什么地方
**************************** 55、*******************************************/
#ifdef ZNFAT_UPDATE_FSINFO_LAST_CLU
void znFAT_Update_FSInfo_Last_Clu(UINT32 Last_Clu)
{
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
((struct FSInfo *)znFAT_Buffer)->Last_Cluster[0]=Last_Clu&0x000000ff;//((UINT8 *)&Last_Clu)[0];
(( 56、struct FSInfo *)znFAT_Buffer)->Last_Cluster[1]=(Last_Clu&0x0000ff00)>>8;//((UINT8 *)&Last_Clu)[1];
((struct FSInfo *)znFAT_Buffer)->Last_Cluster[2]=(Last_Clu&0x00ff0000)>>16;//((UINT8 *)&Last_Clu)[2];
((struct FSInfo *)znFAT_Buffer)->Last_Cluster[3]=(Last_Clu&0xff000000)>>24;//((UINT8 *)&Last_Cl 57、u)[3];
znFAT_WriteSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
}
#endif
/***********************************************************************
- 功能描述:獲得下一個簇的簇號
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:LastCluster:基準(zhǔn)簇號
- 返回說明:LastClutster的下一簇的簇號
- 注:獲得下一簇的簇號,就是憑借FAT表中所記錄的簇鏈關(guān)系來實現(xiàn)的
* 58、**********************************************************************/
#ifdef ZNFAT_GETNEXTCLUSTER
UINT32 znFAT_GetNextCluster(UINT32 LastCluster)
{
UINT32 temp;
struct znFAT_FAT *pFAT;
struct znFAT_FAT_Item *pFAT_Item;
temp=((LastCluster/128)+pArg->FirstFATSector);
znFAT_ReadSector( 59、temp,znFAT_Buffer);
pFAT=(struct znFAT_FAT *)znFAT_Buffer;
pFAT_Item=&((pFAT->Items)[LastCluster%128]);
return LE2BE((UINT8 *)pFAT_Item,4);
}
#endif
/***********************************************************************
- 功能描述:比較目錄名
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:a:指向目錄名1的指 60、針
b:指向目錄名2的指針
- 返回說明:如果兩個目錄名相同就返回1,否則為0
***********************************************************************/
#ifdef COMPARE_DIR_NAME
UINT8 Compare_Dir_Name(CONST INT8 *a,CONST INT8 *b)
{
UINT8 i;
for(i=0;i<8;i++)
{
if(a[i]!=b[i]) return 0;
}
return 1;
}
#endif 61、
/***********************************************************************
- 功能描述:文件名匹配(支持帶*?通配符的文件名的匹配)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:pat:源文件名,可以含*或?通配符 如 *.txt 或 A?.mp3等等
name:目標(biāo)文件名
- 返回說明:如果兩個文件名匹配就返回1,否則為0
- 注:關(guān)于通配文件名匹配,有這樣的例子,比如 A*.txt 與 ABC.txt是匹配的
同時與 ABCDE 62、.txt也是匹配的。此功能在文件枚舉中將會用到,用來匹配
文件名符合一定條件的文件
***********************************************************************/
#ifdef FILENAMEMATCH
UINT8 FilenameMatch(INT8 *pat,INT8 *name)
{
UINT8 match,ndone;
INT8 *cpp,*cpn;
cpp=pat;
cpn=name;
match=1;
ndone=1;
while(ndone)
{
switc 63、h (*cpp)
{
case *:
cpp++;
cpn=strchr(cpn,*cpp);
if(cpn==NULL)
{
cpn=name;
while(*cpn) cpn++;
}
break;
case ?:
cpp++;
cpn++;
break;
case 0:
64、 if(*cpn!=0)
match=0;
ndone=0;
break;
default:
if((*cpp)==(*cpn))
{
cpp++;
cpn++;
}
else
{
match=0;
ndone=0;
}
65、 break;
}
}
return(match);
}
#endif
/***********************************************************************
- 功能描述:znFAT的文件目錄項的文件名字段(8個字節(jié)),轉(zhuǎn)為普通的文件名
如:ABC MP3 將轉(zhuǎn)為 ABC.MP3
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說明:dName:指向文件目錄項的文件名字段的指針
pName:指向轉(zhuǎn) 66、換完成后的文件名
- 返回說明:無
- 注:此函數(shù)配合上面的FilenameMatch函數(shù),就可以實現(xiàn)對文件名通配匹配
***********************************************************************/
#ifdef ZNFAT_TOFILENAME
void znFAT_toFileName(CONST INT8 *dName,INT8 *pName)
{
UINT8 i=0;
for(i=0;i<8;i++) pName[i]=dName[i];
pName[8]=.;
for(i=9;i<12;i++) pName[i]=dName[i-1];
i--;
while(pName[i]==0x20) pName[i--]=0;
pName[i+1]=0;i=7;
while(pName[i--]==0x20);i+=2;
strcpy(pName+i,pName+8);
}
#endif
/*********************
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。