模拟文件系统实验报告.docx
《模拟文件系统实验报告.docx》由会员分享,可在线阅读,更多相关《模拟文件系统实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
模拟文件系统实验报告
操作系统大型试验
实验报告
姓名
班级
学号
XX
软件工程110x
201126630xxx
一、名称
操作系统大型试验。
二、目的
用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、
删除、重命名、文件和目录、文件的拷贝。
三、要求
开发工具:
word,vcwin32api
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)主要函数定义
#defineshow_bnum20#defineblock_size1024intblock[block_size];stringcontent[block_size];intMsize=5;
//显示物理盘块的块数
//物理盘块块数
//假设有block_size块物理盘块
//存放文件内容
//此处为模拟磁盘大小为输入5个字符
fnode*root=newfnode("WP:
",0,0);fnode*current_path=newfnode();fnode*seek_flag=newfnode();fnode*cp_flag=newfnode();voidinitialize();
intseekTarget(stringname);intseek_log(stringname);
voiddelete_node(stringname);intfreeblock(fnode*);
intseekfreeblock();
voidshow_current_path();voidadd_file(stringname,intt);voidshow_curpath_all();
voidrename_file(stringOname,stringNname);
voidseperate();
voidcd();
voidadd_File();
voidadd_Log();
voiddelete_file();
voidshow_memory();
voidre_name();
voidhelp();
voidshow_content();
voidwrite_file();
voidClear_();
voidExit();
voidcp();
voidcp_log(fnode*target,fnode*source);voidcp_file(fnode*target,fnode*source);voidcp_node(fnode*target,fnode*source);intfind_target_log();
intcalculate_logsizeMain(fnode*);
//设置根目录
//当前路径
//作为查找标志
//作为复制的位置标志
//初始化
//搜索文件或目录
//搜索目录
//删除节点
//释放物理盘块
//搜索可用物理盘块
//显示当前路径
//增加目录、文件
//显示当前目录下的所有文件
//重命名
//分离命令
//进入目录
//增加文件功能入口
//增加目录功能入口
//删除文件或目录功能入口
//显示物理盘块占用情况
//重命名功能入口
//查看帮助
//查看文件内容
//写文件
//清屏
//退出
//复制功能入口
//复制目录
//复制文件
//复制节点
//找到复制的目标目录
//计算目录大小
intcalculate_logsize(fnode*);
2)文件节点类的定义:
classfnode
{
public:
stringfilename;
//文件名
inttype;fnode*parent;fnode*child;
fnode*brother;intblock_num;intisBro;intisCld;fnode()
//文件类型,1为普通文件,0为目录文件
//父节点
//子节点
//兄弟节点
//表示占用的物理盘块块号
//表示是否是在同级目录下,0表示不是,1表示是
//是否为目录下第一个节点,1表示是,0表示不是
//初始化
{type=-1;parent=NULL;child=NULL;brother=NULL;block_num=-1;isBro=0;isCld=0;
//根节点初始化
}
fnode(stringn,intt,intb)
{
type=t;filename=n;parent=NULL;child=NULL;brother=NULL;block_num=b;block[block_num]=-3;isBro=0;isCld=0;
fnode(fnode*p,stringname,intt,intb)//文件节点初始化
{parent=p;filename=name;type=t;child=NULL;brother=NULL;block_num=b;block[block_num]=-3;isBro=0;isCld=0;
//拷贝函数
}
voidcopy(fnode*cp)
}
};
4.命令:
filename=cp->filename;type=cp_>type;
parent=cp_>parent;child=cp->child;brother=cp->brother;block_num=cp->block_num;
命令
解释
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+newname
具体格式:
typ
typ命令可以查看当前目录下一个文件的内容,具体格式:
typ+name
wrt
wrt命令可以在当前目录下写内容至一个已存在的文件,具体格式:
wrt+name+content
mem
mem命令可以查看模拟物理盘块的使用情况,具体格式:
mem
cls
cls命令为清屏命令,具体格式:
cls
exit
exit命令为退出命令,具体格式:
exit
五、关键技术流程图及说明
提示:
若图中文字无法看清,可用MicorsoftVisio打开压缩包下"部分程序流程图”文
件夹的绘图文件查看。
1•增加文件或目录(此功能比较简单,流程图写的较详细就不做说明):
口上簸嚼数很入艾刊喀解丈件奥里:
氛酩际洞馭件
2.删除目录(实现级联删除):
说明:
删除目录时删除文件和删除目录本身放在同一个函数中,删除目录下的所有文件
LP
K
放在freeblock函数里,这样比较好处理。
下面给只给出递归函数的流程图。
3.将内容写入文件(实现动态增长):
说明:
图中Msize为模拟规定的文件块字符串大小,比如Msize=5,那么一个物理盘块
只能存5个字符,超出则要申请新的空间。
主要采用双重循环方法写入,外层循环为需要的
块数,内层循环为Msize,用string累加字符串内容,内层循环退出后新申请一个空间并将对应下标赋给上一个物理盘块数组,再将对应内容存入content(为string类型的数组,模
拟存储内容)数组中,直至退出外层循环。
4.复制目录:
说明:
这里和删除目录一样,写了两个复制函数,这样写同样因为递归调用是比较方便,第一个函数传入参数为目标目录指针和被复制的目录的指针,第一个函数里新建了一个阶段
复制被复制的目录的内容,然后将新建节点的子节点和被复制目录的子结点传入下一个递归调用函数(因为目录的内容存于目录的子节点,与兄弟节点无关),第二个函数就是递归调
用函数cp_node,下面就只给出cp_node的流程图(复制之前同样进行了路径的判误操作,内存大小的判断操作,是否重名的判断操作,被复制目录是否存在判断操作,这些操作在递
归函数之前完成,所以下面的递归函数不体现这些操作)。
六、运行结果
1.王界面展示:
图:
主界面展示
2.
help命令展示:
图:
help命令展示
3.echo命令展示:
SinliLatc
FileStaten[M®.*
2014.01.091
有校利.
■i|ifSywtUHi'Filt""Syit裁Fil聲Syi"^1-1
UPi>scho
UP;>dir
yt4«:
n-wfilB文件畑I文件占馬苣块为第’1块初理矗块
ItL->achonenflie
E荐在名^newJlle工贸件!
UP:
>_
4.del命令展示:
图:
del命令展示-普通删除
的宴验情况,W恃可用,-3代表祓占用且为末締4夬其它数宇
目录下元内容!
尊量毎的冥箜犒况,3代耒可用.-?
代表祓占刃且.为去文科决其它数字址下标
-阳
SliiuldLeFileSystem[F^zt.2014.31.09]披收斯有吴纵保曾所有収札
UF:
*臼loglvr;>cdloyl
UP-\Logl>iTMilog2UP:
\loql>ecFofiletUPi'kinjiXirtfi]elabcdEur:
siO3i>cdi<]32
UF:
xlagl>lag2>echaflle2
WP^lojlxlagaJurtfile2967^5
UP:
\lagl\log2losrl
UPi\lojlvlagS^cd..
“讥•「不是内部或扑部命令?
也不是可运行的程序或批处理文件
UP:
\lojlxlag2>cd..
UP:
Mir
目录名’loal文禅类型・目录占用賈,,块物锂盘块
UP:
yncn
以下为前沏卜物塑盘
r我下一块的写址下:
-37-3-3-3-3-9?
-99-椚-99-99-的-斛-99-刘-99-?
?
-99-99-*9
UF:
><191lo3l
VF:
?
dlr
畅目录为三目录,
UP:
>nen就E为前蟹个弋表丁一块的ka-¥7一阳-59
WP:
>_
一爭乎一鼻乎-7?
-JS-75一呼乎-7V-59一丫乎-?
»-99一丫爭一乎爭-99
说明:
创建了目录logl,在logl中创建一系列文件和目录,磁盘使用情况显示已分配
实用del删除命令后查看磁盘分配证明级联删除是可靠的。
图:
del命令展示-级联删除
5.md命令展示:
图:
md命令展示
6.cd命令展示:
说明:
图中展示了cd+name、cd+.、cd+..三种cd命令的使用和判别情况。
'=:
vFie_Sy^term\File_5ystenn\pebLiglFirnqce:
SiniilateFile刘w[版本2B14.JB1.09J就权所有昊鞍保躺有权利。
UP:
>cd无法返E丄扱目录’己经为根弓录!
UP:
>cd..
己逐为艰目杲
UP:
>cda
目录下下存在名力m的文件或目恚或者功文件,元法进人!
!
IfP:
>echca
UP:
Jeda
i目杲下不殍在名为曲文件或目录.或叡为文件元法进心!
MF:
Andlog-
MF:
>c(lloff
UP:
\lcg>ndlo^2
UP:
\lng>cdlng3
WF:
\lag\1oj2^cd.
WP:
\lag>cdlojf2
UP:
\lcg\log2>cd八
WP:
>
图:
cd命令展示
:
.ml
7.dir命令展示:
IntnFiliESy^tanl丽l斫有<UP>昊聖.^aaJ
pPi>dlr
应目杲为空目录档目杲下无内容!
pP:
>wlA
UP:
>49ChOh
WP:
Mir
曼齋;:
m:
it裁
8.typ命令展示:
图:
typ命令展示
9.ren命令展示:
图:
ren命令展示
10.wrt命令展示:
图:
wrt命令展示
说明:
此处为了实验方便,将磁盘大小限定为5,每块磁盘输入的字符数限2,输入的
内容112233445566778899需要9块磁盘块,而磁盘块为5,根目录占用一块,只能输入4块大小的内容,即11223344,所有文件file只写入了11223344。
图:
wrt动态增长展示
11.mem命令展示:
图:
mem命令展示
12.cls命令展示:
SlnulAEOFil0Si^t*n2014.0jl.O9J
肪魂所有<W>昊瓠操會所有极荊h
-99一99
UP二>nefi
懐裂釀曙莽鶴的实验Ift况.■站代義可朗.7代裘被占埔且为末交件堤k3-f?
-9?
-99-?
?
■T号-99-99=9^-?
9一—99一9*¥-9?
-99-99
UP:
>echaFile
UP:
>wptf丄工mmes&a^iu£npuitliellowcirldL
MP->nefk
gg系越翼盖曹歸帛瑕的卖验悄况,T討烁可用.7代表穢占用且为末求祥块.-32315-3-9?
-?
?
T9-?
?
-9?
一\、-,Y-?
?
-?
?
-?
?
-?
?
WF±>a
•是內部或列部命令・也水是叮直行的程序或和处理文件。
V?
:
><*£wj不墨肉外部命令.
VF:
P"环是科希外制命令*
WP:
>df
*d*■■朮是內部或少卜制ip-令-.
UF1><*f
5d」不殳內邙或外邵奋令,
WF;>c1Q
也不是可运行的程序或批处理交林U
也页是可隹行的稈序或批;U理忘仟■世环是叫心:
的樓序或批处理文件。
也不是可远行的程序或批处理交林U
图:
cis命令展示-2
13.cp命令展示:
说明:
图中根目录(WP:
)下创建了目录a(mda)、目录b(mdb),在a目录下创建了b目录(mdb),在b目录中创建了文件a(echoa)、目录c(mdc),文件a中输入1111122222(wrta111112222)内容代表占了两块物理盘块(程序中Msize模拟大小,设为5个字符了),再进入
目录c(cdc),c中先创建目录f(mdf)再创建文件g(与之前创建顺序不同说明程序在不同情况下能正常运行),在g中输入5个3,5个2,5个1(wrtg333332222211111)代表占用3块物理盘块空间,再返回目录a(cd.cd.),将目录a下的目录b复制给目录WP下的目录c(cpb
WP:
\c),再将目录a中的目录b删除(delb证明的确是复制而非简单指针指向),进入WP下的目录c查看刚复制的内容(dir)。
物理盘块使用情况中第一个-3为根目录占用,第二个-3
是目录a,第三个-3是目录c,接下来的8个-99是目录a中原目录b占用的空间(此处证明删除是可靠的),图中显示目录c中确实成功复制了目录b及目录下的所有内容(使用dir命
令查看)。
cFileextern[訳丰2011.01,091亍吴那*•保昌寿肓权利・
TOnda
POrndn
>cday>iwdhzXrlh
\a\b>9chom
\aMb>»jrta1L11122Z2Z
X^\h>nric
\c»SB>cdXrf\b\c>ndf
\a>echoy
\aSb^>«rtgJ93032322211111xaxh\e>cd.
\aSb>cd.
\a>D|jhwr:
>je
b
P:
\r>rti^
寸录名「b文杵夾型:
目录
Ft\cXji!
b
'F:
yxbiMir
t来塞」
-c文1…一...
P■WSt艸a
『件心的內容>1;1111122222
T:
\cMi>cdc
P:
\c\b\c>dir
轎:
沪
T:
\c\Jb\cgf
二■存的力存垢:
333332ZZZ211111
'?
*\jc-XbXc>neni
極超色鑼禪驛常的实過情况・®代義可用,4代封贴用且为末文件块,
3-3-J-99-5IV-W-yy-TV-?
y-J13-3-J-3171M-J
占fflr:
"块牧玦盘块
鶉書减磐豐鰭理盘块
:
\tSb\c)
P:
Pi
\*>cd*
T:
>cdL;
a■E:
\Rle_Sy$teim\File_Sy5tem,\Debug\File.Systenn.exe*
图:
exit命令展示
15.综合展示:
说明:
echoa在根目录(WP:
)下创建了文件a,mdb在根目录(WP:
)下创建了目录b,dir显示根目录下的所有文件和目录,wrtaaaaaabbbbbccccc在文件a中输入了一串内容,
typa显示文件a中的内容,cdb进入目录b,mda在目录b下创建了目录a,cda进入目录a,cd.返回目录b,cd.返回根目录WP:
,renbnewname将目录b重命名为newname,mem显示内存情况,第一个-3代表根节点占用,第二个3代表文件a占用且下一块盘块下标为3,
第三个-3代表目录b占用,之后的4代表被文件a占用且的下一块盘块的寻找下标为4,下
一个-3代表文件a的末盘块,下一个-3代表目录b内的目录a占用,dela在根目录WP:
下删除文件a,mem查看物理盘块实验情况,图中显示原文件a占用的内存空间已经变为-99,
代表成功删除a并释放磁盘空间(-99代表磁盘空间空闲可用),dir显示根目录WP:
下所有文件和目录,显示只有newname,则证明重命名和删除操作是成功的。
图:
综合展示
七、心得体会和调试中遇到的问题及解决办法
编写调试过程中遇到许多问题,一类是指针指向空还继续操作造成程序停止运行,经检查后修改正确,一类是逻辑上出现错误导致级联删除或者目录复制出错,经改正后成功实现。
主要的难点在于兄弟结点和子结点的处理,所以再程序中引入了isBro这个标志位来判断是否是兄弟结点即与父节点是否在同级目录,若不在同级目录则父节点为真父节点(是指向本目录而非本目录中上个文件)。
还有一个难点是在进行递归调用删除或复制目录时发现处理目录和目录下的内容不太合适放在同一个递归程序中,所以单独写了两个函数处理目录的复制或删除,然后对应两个递归程序处理目录下的所有内容。
实验总结及有待改进的问题。
因为时间比较紧张,在几门考试中抽空写了这个小程序,所以并没有实现存盘,另因为对输入命令字符串的处理上有点瑕疵,所有在写文件内容中只能写入连续的字符串(中间不能插入空格),否则会被判定为命令输入错误,并且只实现了文件的写入,不能修改或插入,有待改进。
没有实现目录树的展示,只能显示目录下所有文件,有待改进。
但相信时间再充裕一些这些小问题都能很好地解决。
八、源代码
在压缩包内“源代码”文件夹内。