?? cfs.hpp
字號:
//
// CFS是一款基于小存儲器的文件系統,系統結構如下:
//
// |----------|
// | ROM 0 | --引導扇區DBR,從第0個扇區開始存放,占用扇區0
// | 1 |
// | 2 | --FAT文件分配表,從第1扇區開始存儲,范圍為1~CFS_FAT_SEC
// | 3 |
// | 4 | --文件根目錄區,從第CFS_FAT_SEC+1扇區開始存儲
// | 5 |
// | 6 | --文件數據區
// | 7 |
// | . |
// | . |
// |----------|
//
// CFS沒有主引導扇區,所以她不能作為引導盤。
// 為了降低文件操作的復雜性,她對DBR進行了精簡,只保留了一些系統相關部分。
// CFS只支持一個根目錄,所有文件都放于該文件目錄下。雖然這個‘缺點’使得文件存儲無法
//層次化,但其代碼的實現將會簡單化,同時更能保證系統的穩定性。
// CFS的最小單位為扇區,且她的文件存儲形式是以扇區為文件的存儲單位,而非簇,即一個
//文件存儲于一個或多個扇區中。
// 對于超過一個字節的數據,全部為高位在后
#include"..\cfs_drive\cfs_drive.hpp"
#define ROM_SEC_SIZE (ROM_SIZE/CFS_BYTES_PER_SEC) //存儲器上扇區的數目,單位為扇區
#define CFS_FAT_NUM ROM_SEC_SIZE //文件分配表FAT的表項數目,單位為字節
#define CFS_EXT_MARKER1 0X55 //引導結束符1,為0X55
#define CFS_EXT_MARKER2 0XAA //引導結束符2,為0XAA //文件數據區所占用的扇區數目
/*
*判斷文件分配表FAT所占用的扇區數目
*
*/
#if (CFS_FAT_NUM * 2) % CFS_BYTES_PER_SEC > 0
#define CFS_FAT_SEC ((CFS_FAT_NUM * 2) / CFS_BYTES_PER_SEC + 1) //CFS_FAT_NUM * 2是因為FAT的表項是兩個字節
#else
#define CFS_FAT_SEC ((CFS_FAT_NUM * 2) / CFS_BYTES_PER_SEC)
#endif
/*
*判斷根目錄區的目錄項所占用的扇區數目
*設定每一個文件占用一個扇區,則根目錄區的目錄項所占用的最大扇區數目由以下的計算公式得出
* 因為 ROM_SEC_SIZE = 1 + CFS_FAT_SEC + CFS_ROOTDIR_SEC + CFS_FILE_DAT_SEC
* 又 CFS_ROOTDIR_SEC = CFS_FILE_DAT_SEC * CFS_DIR_ENTYR_SIZE / CFS_BYTES_PER_SEC;
* 所以 CFS_ROOTDIR_SEC = ((ROM_SEC_SIZE - (1 + CFS_FAT_SEC))* CFS_DIR_ENTYR_SIZE)/ (CFS_DIR_ENTYR_SIZE + CFS_BYTES_PER_SEC);
*/
#define CFS_DIR_ENTYR_SIZE 32 //目錄項的大小,單位為字節
#if ((ROM_SEC_SIZE - (1 + CFS_FAT_SEC))* CFS_DIR_ENTYR_SIZE) % (CFS_DIR_ENTYR_SIZE + CFS_BYTES_PER_SEC) > 0
#define CFS_ROOTDIR_SEC (((ROM_SEC_SIZE - (1 + CFS_FAT_SEC))* CFS_DIR_ENTYR_SIZE) / (CFS_DIR_ENTYR_SIZE + CFS_BYTES_PER_SEC) +1 )
#else
#define CFS_ROOTDIR_SEC (((ROM_SEC_SIZE - (1 + CFS_FAT_SEC))* CFS_DIR_ENTYR_SIZE) / (CFS_DIR_ENTYR_SIZE + CFS_BYTES_PER_SEC))
#endif
#define CFS_DBR_START_SEC 0 //DBR的起始扇區
#define CFS_FAT_START_SEC 1 //FAT的起始扇區
#define CFS_ROOTDIR_START_SEC (CFS_FAT_START_SEC + 1) //ROOTDIR的起始扇區
#define CFS_FAT_USE_END 0XFFFF
#define CFS_FAT_NOT_USE 0X0000
class cCFS_DBR{
public:
cfs_uint8 boOEMName[8]; //卷描述字符串
cfs_uint16 bpbBytsPerSec; //每扇區字節數
cfs_uint16 bpbRootDirEnts; //根目錄區的目錄項數
cfs_uint16 bpbTotSec; //存儲卷上的扇區總數目
cfs_uint16 bpbFATSec; //文件分配表FAT所占用的扇區數目
cfs_uint8 ExtMarker1; //引導結束符1,為0X55
cfs_uint8 ExtMarker2; //引導結束符2,為0XAA
public:
cfs_bool cfsDBRGet(cfs_int8 *pSec);
cfs_bool cfsDBRWrt(cfs_int8 *pSec);
cfs_bool cfsDBRForMat(cfs_int8 *pSec);
};
/*
*每個文件目錄占用32字節
*但有用信息只有26字節
*
*/
class cCFS_FILEENTRY
{
public:
cfs_int8 fileName[8]; //文件名,地址偏移0
cfs_int8 fileExtension[3]; //文件擴展名,地址偏移8
cfs_uint8 fileAttributes; //文件屬性,地址偏移11
#define ATTR_NORMAL 0X00
#define ATTR_READONLY 0X01
#define ATTR_HIDDEN 0X02
#define ATTR_SYSTEM 0X04
//cfs_int8 filenotuse[6]; //地址偏移12
//cfs_int8 fileCrtTimeTenth;
cfs_uint16 fileCrtTime; //創建時間,地址偏移18
cfs_uint16 fileCrtDate; //創建日期,地址偏移20
//cfs_int16 fileLstAccDate; //最后操作日期
cfs_uint16 fileWrtTime; //最后更新時間,地址偏移22
cfs_uint16 fileWrtDate; //最后更新日期,地址偏移24
cfs_uint16 fileStartSec; //起始扇區,地址偏移26
cfs_uint32 fileSize; //文件大小,單位為字節,地址偏移28
public:
cfs_bool fileIsOpen; //文件是否被打開,TURE OR FALSE
cfs_int8 *pfile;
cfs_bool cfsFILEGet(cfs_int8 *pSec);
};
typedef cCFS_FILEENTRY cfsFILE;
class cCFS{
public:
cCFS_DBR CfsDbr; //DBR類
cfs_uint16 *pCfsFat; //指向FAT區的指針
cfs_int8 *pCfsSecBuf; //一個扇區大小的數據緩沖區
cfs_uint16 CfsRootDirSec; //根目錄區所占用的扇區數目
// cfs_uint32 cfsROMSize; //存儲器的大小,單位為字節
//cfs_uint16 CfsFATSec; //FAT區所占用的扇區數目
CDchain<cCFS_FILEENTRY> CfsRootDir;
public:
cCFS();
~cCFS();
private:
cfs_uint32 cfscntsize(cfs_int8 *p);
public:
cfs_bool cfsFATForMat(void);
cfs_bool cfsFATGet(void);
cfs_uint16 cfsFATNextSec(cfs_uint16 currentSec);
cfs_uint16 cfsFATFindNullSec(void);
cfs_uint16 cfsFATCntNullSec(void);
void cfsFATSetSec(cfs_uint16 currentsec,cfs_uint16 nextsec);
cfs_bool cfsFATWrt(void);
void cfsRootDirGetAEntry(cfs_uint16 x,cCFS_FILEENTRY *p);
cfs_bool cfsRootDirWrtAEntry(cfs_uint32 x);
cfs_bool cfsRootDirRead(void);
cfs_bool cfsRootDirWrt(void);
cfs_int32 cfsSearchFile(cfs_int8 *pfilename);
cfs_int32 cfsCrtFile(cfs_int8 *pfilename);
cfs_bool cfsLoadFile(cfs_uint32 x);
cfs_bool cfsWrtFile(cfs_uint32 x);
cfs_bool cfsformat(void);
cfs_bool cfsinit(void);
cfs_int32 cfsopen(cfs_int8 *pfilename);
cfs_bool cfsclose(cfs_uint16 hfile);
cfs_bool cfswrite(cfs_int32 i,cfs_int8 *pdat,cfs_uint32 datsize);
cfs_int8* cfsread(cfs_int32 i);
cfs_bool cfsremove(cfs_int8 *pfilename);
cfs_bool cfsrename();
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -