⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfs.hpp

📁 一款运行于ARM上的文件系统
💻 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 + -