文件操作系统课程设计(西安交大城院)文档格式.docx
《文件操作系统课程设计(西安交大城院)文档格式.docx》由会员分享,可在线阅读,更多相关《文件操作系统课程设计(西安交大城院)文档格式.docx(62页珍藏版)》请在冰点文库上搜索。
5.7文件删除模块运行结果 23
5.8权限更改模块运行结果 24
5.9读|写文件模块运行结果 24
6.系统改进的设想与实现 26
6.1修改内容说明 26
6.2实验改进 27
6.3作者物语 27
6.3实现程序(用小六字体打印) 28
62
1实验目的
阅读并调试一个简单的文件系统,模拟文件管理的工作过程 .从而对各种文件操作命令的实质内容和执行过程有比较深入的了解.
了解设计一个n个用户的文件系统,每个用户可以保存M个文件.用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create,delete,open
close,read,write ,exit,cls,dir(我的程序中是cls)(查看所有的用户(管理员))等命令.
2.实验要求
阅读所给文件系统源程序,并加注释(注释量达60%),
修改,完善该系统,画出所设计的文件系统的详细流程图.
3.文件系统功能设计
3.1总体设计
3.1.1主要数据结构
l“主文件目录表项”MFD类型数据结构:
n作用:
定义MDF中的数据块类型(数据块在文件LOGIN.exe文件中的存放形
式)
n定义形式如下:
structMFD
{
charusername[32];
//用户名
boolfilepoint;
//用户文件目录表中有无文件的标志
}*curuser=NULL,*elseuser=NULL;
l“用户文件目录表项”UFD类型数据结构:
定义UFD表中的数据块类型(数据块在文件username.exe文件中的存放形式)
structUFD
charfilename[32];
//文件名
int safecode;
//文件访问权限值
longlength;
//文件长度
}*curfile=NULL;
3.1.2功能设计
该文件系统是一个多用户,多任务的文件系统.对用户和用户的文件数目并没有上限.也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制.
该系统可以支持的操作命令如下:
lcls——用户注销命令.当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面.//没有回到登陆界面只是清屏了
命令格式:
bye
lclose——删除用户注册信息命令.执行该命令后,用户在系统中的所有信息,
包括该用户目录下的所有文件都被删除.命令执行完成后返回登陆界面.
close
l create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名 .该文件的管理信息登记在用户文件信息管理模块中 .执行完该命令后回
到执行命令行.
create>
file1
其中:
”>
“符为提示符,file1为要创建的文件名.
ldelete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行.
delete>
file1为要删除的文件名.
l list——显示当前注册目录下的所有文件信息,包括文件名,文件长度,文件操作权限.
list
lchmod——改变某个文件的执行权限,但前提是该文件是该用户目录下的文件.命令格式:
chmod>
file1.33:
其他用户既有对该文件的读权限又有对该文件的写权限
32:
只能读不能写
31:
只能写不能读
30:
既不能读又不能写
问题:
只是有提示没有权限,但是仍能正常的对文件的读写其中:
file1为要授权的文件名.
lopen——在window界面下打开某个文件.执行该命令后,文件file1将用在
windows界面下的文件形式打开.用户可以在这个方式中对文件进行修改,并
将修改后的内容保存.
open>
file1为要打开的文件名.
lread——读文件信息.将文件信息读入并显示在终端上.
read>
file1为要读的文件名.
l write——向某个文件写入新的信息 .用户可以选择用覆盖原来内容的方式或和在文件的末尾追加新信息的方式写入信息.当要退出时输入”#”即可.
l…——返回主菜单命令窗口.
3.1.3主要功能模块
l菜单模块:
voidMenu(void)
作用:
显示调用”登陆界面”
l登陆显示模块:
intLoginDisplay()
根据DOS界面提示,用户选择不同的操作
l登陆选择模块:
boolLogin(intSELETE)
通过用户做出的选项执行不同的操作.
l显示当前用户文件目录表模块:
voidDisplayUFD()
显示出当前用户目录表中的文件清单(文件名,文件长度,访问权限)
l分离|识别用户命令模块:
voidCommand()
将用户输入的命令进行分解,已提供操作系统命令的识别和执行.用户名命令字符串=“命令关键字字符串”+”目标文件名”
l系统命令初始化模块:
voidKeyWord()
将用户自定义的系统命令,初始化依次(此处的初始化工作,中的命令是按照ASCII码值的大小进行排序的,便于Command()函数更好的利用”快速查找算法对用户输入命令的识别操作).
l命令执行模块:
voidExecute(inti,intlen,intcmdset)
将Command()函数处理过的用户命令的种类的不同,选择调用不同的文件操作函数,实现不同的功能.
l文件访问权限设置模块:
voidChangeMod()
修改当前用户文件目录中的文件的访问权限(共四种(只读,只写,既能读又能写,不能读又不能写))
l删除用户模块:
voidDeleteUser()//删除用户注册目录的操作
删除当前用户,并删除当前用户文件目录中的所有的文件目录项数据块;
l删除文件目录表模块:
boolClearUserFile()
实现删除用户操作的第一步:
删除当前用户文件目录表UFD中的所有的文件;
即username.exe文件中为NULL(没有文件);
l删除MDF中的主文件目录表项模块:
voidClearUserMes()
l作用:
实现删除用户的第二步,删除主文件目录表MDF中的当前用户(即:
删除LOGIN.exe
文件中的当前用户的数据块;
l双重功能模块(注销模块):
voidByeFile(boolBOOL)
双重功能
nBOOL为TRUE时,只是起到刷新LOGIN.exe文件中数据块(数据块)
nBOOL为FALSE时:
删除当前用户,服务于DeleteUser()函数,重新
LOGIN.exe文件中的数据块;
l创建文件模块:
voidCreatFile()
在当前用户中,新建一个文件
l文件打开模块:
voidOpenFile()
在window模式下打开目标文件;
l书写新建文件的长度模块:
void WriteLengthToFile(int Len,bool BOOL)作用:
实现将新建的文件(或者新写入的文件)的长度,写入到当前的用户文件目录表(username.exe)文件中的对应的数据快中;
l文件长度变更检查模块:
boolWriteRight(intlen,boolBOOL)
双重功能:
nBOOL为TRUE,计算”累加式写入目标文件”后的文件的长度;
nBOOL为FALSE,计算”覆盖式写入目标文件”后的文件长度;
l读文件模块:
voidReadFile()
读取目标文件中的内容,显示到Screen中(DOS窗口)
l写文件模块:
voidWriteFile()
将从键盘中键入的字符流(scream)写入到目标文件中;
l读写访问权限查询模块boolQueryMod(boolBOOL)
读|写当前目标文件时,查询当前用户,是否有读|写该文件的权限;
l读写文件查询服务模块boolQueryModElse(boolBOOL,bool&
flag)
是QueryMod()函数的延伸功能模块,进行深层次的权限查询,即查询MDF中(此处指LOGIN.exe文件中)”非当前用户文件目录表中”是否存在目标文件,存在时,是否允许当前用户的读|写权限操作.
3.2总体设计流程图
更
查
创
删
改
找
建
除
文
用
件
户
权
限
开始
选择操作
N
用户登录
用户注册
帮助文档
退出系统
用户查询
结束
在MFD中查找到当前
用户
Y
初始化命令关键字
输入操作命令
打
开文件
读
文件
写
保
存用户文件
继续执行操
作
MDF中的用户
图1总体设计流程图
4.文件系统功能模块详细设计流程图
4.1菜单模块:
(intLoginDisplay())
1
2
3
4
5
手动输入
End
相关进程
(命令行)
图2菜单模块
4.2注册用户模块
输入名
册 Y
提示重新
注册
Begin
提示
已注
提示:
注册成功
是否继续
END
图3用户注册模块
4.3用户登陆模块(boolLogin(intSELETE))
提示输入
用户名
有用户
没有MDF
登录
成功
图4用户登陆模块
4.4用户查询模块((voidList_All_user(void)))
能打开?
依次关闭打开的文件
读(LOGIN.exe)文件中的数据块
(输出用户名)
读的形式打开
MDF(LOGIN.exe)
更新
图5用户查询模块
4.5创建文件模块((voidList_All_user(void)))
重新创建
?
准备将新建的文件写入追加打开curuser.exe
将目标文件
(用户文件目录表项)写入到用户文件目录表中(username.exe)
用户文件目录项各个成员赋值
以写形式打开目标文件
(开始创建目标文件)
读的形式打目标文件
(检查当前用户下是否已有目标文件)
目标文件文件已存在
图6穿件文件模块
4.6文件查找模块(voidDisplayUFD())
UFD中有无文件
(curuser->
filepoint)
“rb”打开
到了
(username.exe)
文件的末尾?
依次关闭文件
当前UFD表中无任何文件
读出1个文件(数据块)的信息
图7文件查找模块
将读出的数据块
(用户文件)写入到新建的UFD表中(outfilelocate.exe)
4.7文件删除模块(voidDeleteFile())
UFD中有此文
件?
确定要删除此
文件?
是要删除的文
件吗?
username.exe文件末尾了吗?
对新的UFD表重命名
依次关闭打开文件
收回磁盘空间
(旧UFD表+被删文件)
从旧的UFD表中,读出1个信息块(一个文件)
新建一个UFD文件
(outfilelocate.exe)
以”rb”形式打开
浏览当前UFD表
图8文件删除模块
4.8更改文件读写权限模块(voidChangeMod())
读到了UFD的
末尾?
是目标文件
重写目标文件
UFD表中没有目标文件
读出UFD中的1个数据项(文件)
收回旧的文件所占磁盘空间
更改相应的权限值
[30|31|32|33]
以”rb”的形式打开UFD查找,
查找目标文件
图9权限设置模块
4.9写文件模块(voidWriteFile())
Write命令
无此文件
当前用户没有
此文件
无访问权限
当前用户无访
问权限
1覆盖|2追加|3
取消
在原来的文件尾附
加信息
继续操作
图10写文件模块
4.10读文件模块(voidReadFile())
Read命令
不能打开
被读文件
不存在
当前用户没有此文件
图11读文件模块
5.实验运行结果
5.1菜单模块运行结果
图11菜单显示
5.2注册模块运行结果
l成功注册时显示如下:
l重复注册时,显示如下:
图12菜单显示
图13注册用户显示
5.3登陆模块运行结果
l已注册登陆运行结果:
l未注册登陆运行结果
图14登陆成功显示
图15登陆异常显示
5.4用户查询模块运行结果
图16用户查询显示
5.5文件创建模块运行结果
图17(a)文件穿件显示
图17(b)文件穿件显示
5.6查看当前用户文件目录表模块运行结果
图18(a)查看当前文件显示
图18(b)查看当前文件显示
5.7文件删除模块运行结果
图19(a)文件删除显示
图19(b)文件删除显示
5.8权限更改模块运行结果
图20权限更改显示
5.9读|写文件模块运行结果
图21(a)读|写文件显示
图21(b)读|写文件显示
6.系统改进的设想与实现
6.1修改内容说明
l修改内容1:
原程序Bye命令的问题(只起到了清屏的作用,也没有起到返回到主页面的作用;
更没有起到注销的作用.)
n我的修改:
u分析错误的原因:
bye:
该命令调用的是voidByeFile(boolBOOL)
该函数是双功能函数:
1.BOOL=true,是注销用户,相当刷新了一次LOGIN.exe(MFD)(原程序中,
参数不正确)
2.BOOL=false.则是删除了当前用户,相当于更新了一次LOGIN.exe(MFD)
u改进:
--新增cls命令(纠正了ByeFile()函数的参数)
1.实现注销操作的功能:
自定义:
cls命令,替换了bye命令,实现用户文件目录的刷新操作;
又因2.实现清屏的功能:
cls命令中添加了(system(“cls”)库函数,也起到了清屏作用)
l修改内容2:
原程序中的权限设置函数没有起到改用的作用(虽说应经设置了访问权限,但
是非当前用户仍能访问该文件)
nChmod命令涉及到了两个函数:
uboolQueryMod(boolBOOL):
它的作用是,第一层检查文件的读写访问权限(只在当前用户文件目录表中查找)+使用第二层权限检查的结果(在非当前用户目录中权限监测的结构);
我的更改:
只动了2句话:
1.if((BOOL_1==QueryModElse(BOOL,flag)))//查找returntrue;
改为:
if(QueryModElse(BOOL,flag))returntrue;
2.if(feof(fp1)&
&
!
BOOL_1)returnfalse;
1.if(feof(fp1)&
QueryModElse(BOOL,flag))returnfalse;
//--------------------定义的变量BOOL_1没有使用
uboolQueryModElse(boolBOOL,bool&
flag):
该函数是在非当前用户的用户文件目录中,查找目标文件的权限,是否允许当前用户操作;
l修改内容3:
原程序,在第一次注册用户后,登陆成功后新建的一个文件,在第二
次登陆后,在用list命令查看时,系统中已存在该文件,但是显示为:
当前用户
文件目录中为空(已经存在文件不显示);
nList命令显示文件提示无文件涉及到两个地方
u新用户注册时,curuser->
filepoint=false;
fwrite(curuser,sizeof(MFD),1,fp);
uvoidDisplayUFD()函数中:
if(curuser->
filepoint==false)
//cout<
<
“\n用户 “<
curuser->
username<
“ 文件夹是空的”
endl;
l修改内容4:
原程序中,新建的用户,在当前用户文件目录中,新建了一个新的文件,立即用list命令查看UFD清单时,会找不到该文件
n错误的原因:
voidCreatFile()该函数出现了问题:
当前用户在当前用户文
件目录表中,创建了一个新的文件后,没有更新LOGIN.exe文件(没有清除
当前用户的curuser->
filepoint=true;
没有保存到LOGIN.exe文件中
在该函数的末尾天剑了更新MDF表(LOGIN.exe)文件即可
ByeFile(true);
//最后:
更新MDF()//自己添加的东西
l修改内容5:
原程序很多地方不符合常理:
比如说删除一个不存在的文件也能删除成功,修改一个不存在的文件的权限也能修改成功;
在对一个文件的增删改查等操作的时候,没有对当前用文件目
录中的文件进行查找操作!
自定义了一个在当前用户文件目录中,按文件名查询的函数
void QueryFile(void),返回值为true,当前用户中有该文件’返回值为
false,当前用户中无此文件;
这也再将该函数加入到其他功能函数首,执行前,进行一次判断(是否有目标文件,若是没有该文件,退出操作当前操作);
6.2实验改进
l新添加系统命令:
”...”
说明:
”…” 改该命令,作用是返回到根菜单目录,已进行其他用户的[登
陆|注册|查看|帮助文档|退出系统]等操作;
l新增函数QueryFile(void):
用户目录表中,文件存在检查函数:
QueryFile()函数实现,在进行文件操作[文件曾|删|改|查|读|写等操作之前,先判断是否有该文件,进而再进行相应的操作,确保命令真实有效]
l自定义用户函数:
voidMenu(void)函数
使得返回到跟菜单跟方便,主函数更简单,模块化更强;
l新增帮助文档:
可以对当前文件系统的操作指令集展示给用户!
6.3作者物语
l该系统,是在原来的基础上,进行的,目的不是为了增加其功能,而是为了完善已有功能,了解对”二级文件目录结构”的增/删/改/查/权限设置等操作的实现过程;
l由于自己边加注释,边改程序(自己认为原程序有不通的地方,就随笔更改了,因此可能现在找到的程序中的bug要远远少于我自己做的改动!
)
l我认为文件操作系统(Filesystem)数据结构设计的不是很合理,一下提出自己的理解和猜想我认为,系统主文件目录表(LOGIN.exe)中的数据块,应该采用链表的形式,进行存储,这应便于实现用户的:
增/删/改/查等的操作;
用户文件目录表中(username.exe)文件中,数据块之间,也应该采用链表的形式存放,这样也实现了方便用户的增/删/改/查操作,减少了代码量和程序员的负担.
6.3实现程序(用小六字体打印).
/*****************************************************************
*文件名:
Simple_file_system.c
*功能:
简单文件管理系统模拟程序