📄 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 + -