资源描述
操作系统大型试验
实
验
报
告
姓名:XX
班级:软件工程110x
学号:201126630xxx
一、名称
操作系统大型试验。
二、目得
用C++编写出一个简单得模拟文件系统,实现目录得添加、删除、重命名,文件得添加、删除、重命名、文件与目录、文件得拷贝。
三、要求
开发工具:word,vc win32api
1、设计与实现一个简单得文件系统,要求包括目录、普通文件与文件得存储
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_ name,int t); ﻩﻩ//增加目录、文件
void show_curpath_all(); ﻩ ﻩ //显示当前目录下得所有文件
void rename_ 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_ *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 ; ﻩ//文件名
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;
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;
ﻩ name;
ﻩ type=t;
child=NULL;
ﻩ brother=NULL;
block_num=b;
ﻩ block[block_num]=-3;
ﻩ isBro=0;
ﻩ isCld=0;
}
void copy(fnode *cp)ﻩ ﻩﻩ //拷贝函数
ﻩ {
ﻩ cp->;
ﻩﻩ 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+name
cd
cd命令可以进入下一级目录或返回上级目录、根目录,具体格式:cd+name或cd+、或cd+、、
cp
cp命令可以复制当前目录下一个指定得文件或目录至指定得目录,具体格式:cp+name+road
dir
dir命令可以显示当前目录下得所有文件与目录,具体格式:del
ren
ren命令可以重命名一个存在于当前目录下得文件或目录,具体格式:ren+name +new name
typ
typ命令可以查瞧当前目录下一个文件得内容,具体格式:typ+name
wrt
wrt命令可以在当前目录下写内容至一个已存在得文件,具体格式:wrt+name +content
mem
mem命令可以查瞧模拟物理盘块得使用情况,具体格式:mem
cls
cls命令为清屏命令,具体格式:cls
exit
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命令得使用与判别情况。
图:cd命令展示
7、dir命令展示:
图:dir命令展示
8、typ命令展示:
图:typ命令展示
9、ren命令展示:
图:ren命令展示
10、wrt命令展示:
图:wrt命令展示
说明:此处为了实验方便,将磁盘大小限定为5,每块磁盘输入得字符数限2,输入得内容112233445566778899需要9块磁盘块,而磁盘块为5,根目录占用一块,只能输入4块大小得内容,即,所有文件file只写入了11223344 。
图:wrt动态增长展示
11、mem命令展示:
图:mem命令展示
12、cls命令展示:
图:cls命令展示-1
图:cls命令展示-2
13、cp命令展示:
说明:图中根目录(WP:)下创建了目录a(md a)、目录b(md b),在a目录下创建了b目录(md b),在b目录中创建了文件a(echo a)、目录c(md c),文件a中输入1111122222(wrt a 111112222)内容代表占了两块物理盘块(程序中Msize模拟大小,设为5个字符了),再进入目录c(cd c),c中先创建目录f(md f)再创建文件g(与之前创建顺序不同说明程序在不同情况下能正常运行),在g中输入5个3,5个2,5个1(wrt g 333332222211111)代表占用3块物理盘块空间,再返回目录a(cd 、 cd 、),将目录a下得目录b复制给目录WP下得目录c(cp b WP:\c),再将目录a中得目录b删除(del b证明得确就就是复制而非简单指针指向),进入WP下得目录c查瞧刚复制得内容(dir)。物理盘块使用情况中第一个-3为根目录占用,第二个-3就就是目录a,第三个-3就就是目录c,接下来得8个-99就就是目录a中原目录b占用得空间(此处证明删除就就是可靠得),图中显示目录c中确实成功复制了目录b及目录下得所有内容(使用dir命令查瞧)。
图:cp命令展示
14、exit命令展示:
图:exit命令展示
15、综合展示:
说明:echo a在根目录(WP:)下创建了文件a,md b在根目录(WP:)下创建了目录b,dir显示根目录下得所有文件与目录,wrt a aaaaabbbbbccccc在文件a中输入了一串内容,typ a显示文件a中得内容,cd b进入目录b,md a在目录b下创建了目录a,cd a进入目录a,cd 、返回目录b,cd 、返回根目录WP:,ren b newname将目录b重命名为newname,mem显示内存情况,第一个-3代表根节点占用,第二个3代表文件a占用且下一块盘块下标为3,第三个-3代表目录b占用,之后得4代表被文件a占用且得下一块盘块得寻找下标为4,下一个-3代表文件a得末盘块,下一个-3代表目录b内得目录a占用,del a在根目录WP:下删除文件a,mem查瞧物理盘块实验情况,图中显示原文件a占用得内存空间已经变为-99,代表成功删除a并释放磁盘空间(-99代表磁盘空间空闲可用),dir显示根目录WP:下所有文件与目录,显示只有newname,则证明重命名与删除操作就就是成功得。
图:综合展示
七、心得体会与调试中遇到得问题及解决办法
编写调试过程中遇到许多问题,一类就就是指针指向空还继续操作造成程序停止运行,经检查后修改正确,一类就就是逻辑上出现错误导致级联删除或者目录复制出错,经改正后成功实现。
主要得难点在于兄弟结点与子结点得处理,所以再程序中引入了isBro这个标志位来判断就就是否就就是兄弟结点即与父节点就就是否在同级目录,若不在同级目录则父节点为真父节点(就就是指向本目录而非本目录中上个文件)。还有一个难点就就是在进行递归调用删除或复制目录时发现处理目录与目录下得内容不太合适放在同一个递归程序中,所以单独写了两个函数处理目录得复制或删除,然后对应两个递归程序处理目录下得所有内容。
实验总结及有待改进得问题。
因为时间比较紧张,在几门考试中抽空写了这个小程序,所以并没有实现存盘,另因为对输入命令字符串得处理上有点瑕疵,所有在写文件内容中只能写入连续得字符串(中间不能插入空格),否则会被判定为命令输入错误,并且只实现了文件得写入,不能修改或插入,有待改进。没有实现目录树得展示,只能显示目录下所有文件,有待改进。但相信时间再充裕一些这些小问题都能很好地解决。
八、源代码
在压缩包内“源代码”文件夹内。
展开阅读全文