操作系统大型试验实验报告姓名:XX班级:软件工程110x学号:*********xxx一、名称操作系统大型试验。
二、目的用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。
三、要求开发工具:word,vc win32api1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储2.文件系统的目录结构采用类似Linux的树状结构;3.要求模拟的操作包括:a)目录的添加、删除、重命名;b)目录的显示(列表)c)文件的添加、删除、重命名d)文件和目录的拷贝4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明5.用户输入exit时退出该系统6.实验实现基于windows平台;7.实验开发语言可以选用C/c++等四、设计1.主要思路说明本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。
模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。
设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。
搜索空白物理盘块时采用顺序搜索物理盘块数组。
存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。
本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!2.申优功能:1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。
2)能实现级联删除,即当删除目录(文件夹)时,目录下的所有内容也应当删除并正确释放物理盘块空间。
3)能实现目录的复制,即复制目录时(文件夹)时,该目录下的所有文件和目录也应准确复制至目标目录中,并正确分配物理盘块空间。
3.主要函数和类的定义1)主要函数定义#define show_bnum 20//显示物理盘块的块数#define block_size 1024//物理盘块块数int block[block_size];//假设有block_size块物理盘块string content[block_size];//存放文件内容int Msize=5;//此处为模拟磁盘大小为输入5个字符fnode *root=new fnode("WP:",0,0);//设置根目录fnode *current_path=new fnode();//当前路径fnode *seek_flag=new fnode();//作为查找标志fnode *cp_flag=new fnode();//作为复制的位置标志void initialize();//初始化int seekTarget(string name);//搜索文件或目录int seek_log(string name);//搜索目录void delete_node(string name);//删除节点int freeblock(fnode *);//释放物理盘块int seekfreeblock();//搜索可用物理盘块void show_current_path();//显示当前路径void add_file(string name,int t);//增加目录、文件void show_curpath_all();//显示当前目录下的所有文件void rename_file(string Oname,string Nname);//重命名void seperate();//分离命令void cd();//进入目录void add_File();//增加文件功能入口void add_Log();//增加目录功能入口void delete_file();//删除文件或目录功能入口void show_memory();//显示物理盘块占用情况void re_name();//重命名功能入口void help();//查看帮助void show_content();//查看文件内容void write_file();//写文件void Clear_();//清屏void Exit();//退出void cp();//复制功能入口void cp_log(fnode *target,fnode *source);//复制目录void cp_file(fnode *target,fnode *source);//复制文件void cp_node(fnode *target,fnode *source);//复制节点int find_target_log();//找到复制的目标目录int calculate_logsizeMain(fnode *);//计算目录大小int calculate_logsize(fnode *);2)文件节点类的定义:class fnode{public:string filename;//文件名int type;//文件类型,1为普通文件,0为目录文件fnode *parent;//父节点fnode *child;//子节点fnode *brother;//兄弟节点int block_num;//表示占用的物理盘块块号int isBro;//表示是否是在同级目录下,0表示不是,1表示是int isCld;//是否为目录下第一个节点,1表示是,0表示不是fnode()//初始化{type=-1;parent=NULL;child=NULL;brother=NULL;block_num=-1;isBro=0;isCld=0;}fnode(string n,int t,int b)//根节点初始化{type=t;filename=n;parent=NULL;child=NULL;brother=NULL;block_num=b;block[block_num]=-3;isBro=0;isCld=0;}fnode(fnode *p,string name,int t,int b)//文件节点初始化{parent=p;filename=name;type=t;child=NULL;brother=NULL;block_num=b;block[block_num]=-3;isBro=0;isCld=0;}void copy(fnode *cp)//拷贝函数{filename=cp->filename;type=cp->type;parent=cp->parent;child=cp->child;brother=cp->brother;block_num=cp->block_num;}};4.命令:命令解释echo echo命令可以在当前目录下创建一个文件,具体格式:echo+name md md命令可以在当前目录下创建一个目录文件,具体格式:md+name del del命令可以在当前目录下删除一个已存在的文件或目录(支持级联删除),具体格式:del+namecd cd命令可以进入下一级目录或返回上级目录、根目录,具体格式:cd+name或cd+.或cd+..cp cp命令可以复制当前目录下一个指定的文件或目录至指定的目录,具体格式:cp+name+roaddir dir命令可以显示当前目录下的所有文件和目录,具体格式:delren ren命令可以重命名一个存在于当前目录下的文件或目录,具体格式:ren+name +new nametyp typ命令可以查看当前目录下一个文件的内容,具体格式:typ+name wrt wrt命令可以在当前目录下写内容至一个已存在的文件,具体格式:wrt+name +contentmem mem命令可以查看模拟物理盘块的使用情况,具体格式:memcls cls命令为清屏命令,具体格式:clsexit exit命令为退出命令,具体格式:exit五、关键技术流程图及说明提示:若图中文字无法看清,可用Micorsoft Visio打开压缩包下“部分程序流程图”文件夹的绘图文件查看。
1.增加文件或目录(此功能比较简单,流程图写的较详细就不做说明):2.删除目录(实现级联删除):说明:删除目录时删除文件和删除目录本身放在同一个函数中,删除目录下的所有文件放在freeblock函数里,这样比较好处理。
下面给只给出递归函数的流程图。
3.将内容写入文件(实现动态增长):说明:图中Msize为模拟规定的文件块字符串大小,比如Msize=5,那么一个物理盘块只能存5个字符,超出则要申请新的空间。
主要采用双重循环方法写入,外层循环为需要的块数,内层循环为Msize,用string累加字符串内容,内层循环退出后新申请一个空间并将对应下标赋给上一个物理盘块数组,再将对应内容存入content(为string类型的数组,模拟存储内容)数组中,直至退出外层循环。
4.复制目录:说明:这里和删除目录一样,写了两个复制函数,这样写同样因为递归调用是比较方便,第一个函数传入参数为目标目录指针和被复制的目录的指针,第一个函数里新建了一个阶段复制被复制的目录的内容,然后将新建节点的子节点和被复制目录的子结点传入下一个递归调用函数(因为目录的内容存于目录的子节点,与兄弟节点无关),第二个函数就是递归调用函数cp_node,下面就只给出cp_node的流程图(复制之前同样进行了路径的判误操作,内存大小的判断操作,是否重名的判断操作,被复制目录是否存在判断操作,这些操作在递归函数之前完成,所以下面的递归函数不体现这些操作)。
六、运行结果1.主界面展示:图:主界面展示2.help命令展示:图:help命令展示3.echo命令展示:图:echo命令展示4.del命令展示:图:del命令展示-普通删除说明:创建了目录log1,在log1中创建一系列文件和目录,磁盘使用情况显示已分配,实用del删除命令后查看磁盘分配证明级联删除是可靠的。
图:del命令展示-级联删除5.md命令展示:图:md命令展示6.cd命令展示:说明:图中展示了cd+name、cd+.、cd+..三种cd命令的使用和判别情况。