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