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

📄 disk.h

📁 模拟Linux文件系统 在任一OS下
💻 H
字号:
#include<iostream.h>
#include<math.h>
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
#include <windows.h>
#include <stdio.h>
#define block_end 0x55
#define bootcodesize 250
#define filename_size 25
#define dirjudge 0x66
#define superblock 32
#define blockamount 12800


class disk{
public:
	fstream iof;
	disk();
	disk_open(fstream);
	void format();
	void block_to_buffer(int,int);
	void installfilesystem();
 //   void installfilesystem();
};
class bootblock{
public:
	char bootcode[bootcodesize];
};


#define extend 0xfffe
#define MYTEXT 0
#define MYFOLDER 1
class inode{
public:
	inode(const inode &);
	inode();
	void inode_ini();
	int inode_num;
	int file_size;//文件大小或文件夹项数
	int type;
	int time_foundation;
	int time_modify;
	int address[10];
	int firstindex;
	int secondindex;
	int extend1;
	int extend2;
	int extend3;//文件夹开始项号
	int extend4;//文件夹结束项号
	int inode_judge();//判断是不是inode节点
	void inode_clear();//清空inode
};
/*
class diritem{
public:
    char filename[filename_size];
	int inode_num;
	void get(fstream);
	int diritemjudge();
};
*/
#define inodelistbeg 14
#define inodelist_disklength 600
class inodelist_disk{//用50块,由第14块一直到第64块,每块放12个node,每个inode84字节
public:
	fstream iof;
	inodelist_disk(fstream);
	void inodelist_disk_location(int);//根据inode定位
	void inodelist_disk_write(int,inode);//根据inode号写表
	void inodelist_disk_read(int,inode*);//根据inode号读inode
	int inodelist_disk_applyfor();//通过逐个读+判断来申请inode号
};
/*
class dir{
public:
	fstream iof;
	inode itemp;
    int inode_to_inode_findbyname(char*);
	dir(fstream,inode);
	int buffer_readbyname(char*);
	void buffer_readname();
	int block_endjudge(char*);
};*/

#define filenamelength 20
#define extend_judge 0xfefe
class folderitem{
public:
	char filename[filenamelength];
	int inodenum;
	int next;
	int before;//若是第一项就是上一文件夹inode号,否则就是前一项
	int extend1;
	void folderitem_clear();//全部清0
	folderitem();
	int folderitem_judge();//判断是不是folderitem
};
class folder{//一个目录项36字节,一个块28项
public:
	fstream iof;
	inode folderinode;
	void folder_open(fstream,inode);
	folder(fstream,inode);
	int folder_location(int);//根据项号与自身inode定位
	void folder_read(int,folderitem*);//根据项号读项
	int folder_findbyname(char*);//根据文件名查找项号
	void folder_browse();//浏览文件夹
	int folder_applyfor();//申请空闲项
	void folder_write(int,folderitem*);//根据项号和inode写项
	void folder_deleteitem(int);//根据项号删除项
	void folder_deletebyname(char*);//根据文件名删除项
	void folder_makedir();//文件夹创建.项与..项
	void folder_inodewriteback();//inode回写
	void folder_write_nocondition(int,folderitem*);//简单的写回
};

/*
class nowaddress{
	char *nowpath;
	int inodenum;
	nowpath_update(char*);
	nowpath_addnow(char*);	
};*/
#define freebitmapbeg 1
class freebitmap{//一个块1000位,有13个块,从1到13
public:
	fstream iof;
	freebitmap(fstream);
    int freebitmap_location(int);//根据块号定位,返回一个字节内的第几位
	int freebitmap_read(int);//根据块号读位
	void freebitmap_set(int);//根据块号置1
	void freebitmap_clear(int);//根据块号清0
    int freebitmap_applyfor();//申请
};
class superblock_disk{
public:
//	superblock_disk(int r=0,int ba=0,int bs=0,int bb=0,int sb=0,int fb);
	superblock_disk();
	int rootnum;
	int block_amount;
	int block_size;
	int bootblock_beg;
	int superblock_beg;
	int freelist_beg;
	int inodelist_indisk_beg;
	int root_beg;
};
#define fileimageend "itisexactllytheendofthefileandfiletheofendtheexactllyisit"
class fileimage{//每80个字节为一行,一个块有12行
public:
	fstream iof;
	inode fileimageinode;
	void fileimage_open(fstream,inode);
	int myeof(char*);//判断是否到文件末
	int fileimage_location_text(int);//根据行号和inode定位
	void fileimage_getimage_text(char*image);//打开文件映像
	void fileimage_inodewriteback();//inode回写
	void fileimage_outimage_text(char*image);//向外复制文件复制到image所指向的文件中
	void fileimage_cat_text();//浏览文件
};


/////////////////////////////////////////////////////////////////////////////控制台借口
#define currentpath_maxlevel 20
#define currentpath_maxlength 200
class currentpath{
public:
	char*cp;
	int level;//当前路径有多少层
	int cpformat[currentpath_maxlevel][2];//每层开始与结束位置放在cpformat的一项中
	currentpath(char*);
	currentpath();
	void format();
	void open(char*);
	void sub();
	void getname(char*,int);//通过层数获取文件名
	void add(char*);//路径后添加文件名
};
void user_applyfor_openfilemanagerhandle();
void user_applyfor_openfilehandle(currentpath*cp,
								int paracteristic//文件访问特征,0表示R,1表示W,3表示RW
								);
/*
#define applyarraysize 20
class applyarray{
private:
	int array[applyarraysize];//记录着请求的循环队列,beg与end相等表示队列为空,end的下一项是beg表示队列已经满
	int beg;
	int end;
public:
	applyarray();
	void able_get();
	void get();
	void able_put();
	void put(int);
};

applyarray aatemp;

#define APPLYNUM_CD 0
#define APPLYNUM_DIR 1
*/
class mystring{

public:
	char*mp;
	int sit;
	mystring();
	void open(char*);
	void get(char*);
	void gobeg();
};
////////////////////////////////////////////////////////////////////////////////////第二层有两部分
///////////////////////////第一部分:打开文件描述表与inode内存表,主要是从句柄到对象的转换,以服务器的方式进行
#define servicehandle openfileitem*
class openfileitem{
	friend class openfilemanager;
	friend class openfiledescriptortable;
	friend void kernel_createfolder(servicehandle,//根据获得的服务句柄以及要创建的文件夹名创建文件夹
				  char*
				  );
	friend void kernel_folderbrowse(servicehandle);//根据服务句柄浏览文件夹
	friend void kernel_folderdeleteitem(servicehandle,char*);
	friend void kernel_createfile(servicehandle,
					   char*
					   );
	friend void kernel_filecat_text(servicehandle sh);
	friend void kernel_folderdeletefile(servicehandle,char*);
	friend void kernel_fileoutcopy(servicehandle,char*image);
	friend int kernel_foldercd(servicehandle sh,char*name);
private:
	//openfileitem(inode*);//初始化
	int filesite;//文件位置
	int paracteristic;//文件访问特征,0表示R,1表示W,3表示RW
	int usetimes;//该项使用的进程数
	inode*pinode;//指向inode内存表的inode项
};
#define openfiledescriptortableamount 50
class openfiledescriptortable{
private:
	openfileitem ofitable[openfiledescriptortableamount];//打开文件描述表
	int availability[openfiledescriptortableamount];//表项的使用状况
public:
    void openfiledescriptortable_ini();//初始化
	openfileitem*createopenfile(inode*pinode);//创建一个打开文件描述表项,并且该项的pinode指针指向pinode
	openfileitem*openopenfile(openfileitem*);//打开一个描述表项
	inode* deleteitem(openfileitem*);
};
#define inodelist_memoryamount 50
class inodelist_memory{
private:
	inode inodelist[inodelist_memoryamount];
	int usetimes[inodelist_memoryamount];//该inode的打开次数,0表示该项没有被使用
public:
	void inodelist_memory_ini();
	void deleteitem(inode*);
	inode*inodelist_memory_searchbyinodenum(int inodenum);//按inode号查找表,若找到则表的usetimes++,若找不到则按inodenum从硬盘写入表,返回inode指针
};
class openfilemanager{
private:
	openfiledescriptortable ofdt;
	inodelist_memory ilm;
public:
	openfilemanager();
	openfileitem*createopenfileitem(currentpath*);//获取openfileitem句柄,即服务句柄,可以加上权限检测
	openfileitem*openopenfile(openfileitem*);//打开一个描述表项
	int searchinodenumbycurrentpath(currentpath*);//根据当前路径查找inode号
	void deleteitem(openfileitem*);
};
///////////第二部分:内核服务分配与内核函数
#define MY_CREATE_FOLDER 0
void kernel_createfolder(servicehandle,//根据获得的服务句柄以及要创建的文件夹名创建文件夹
				  char*
				  );
void kernel_folderbrowse(servicehandle);//根据服务句柄浏览文件夹
void kernel_folderdeleteitem(servicehandle,char*);
void kernel_createfile(servicehandle,        //根据文件映像载入文件
					   char*
					   );
void kernel_filecat_text(servicehandle);//浏览文件
void kernel_folderdeletefile(servicehandle,char*);//根据文件名删除文件
void kernel_fileoutcopy(servicehandle,char*image);//向外复制文件复制到image所指向的文件中
int kernel_foldercd(servicehandle sh,char*name);

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -