文件操作系统课程设计西安交大城院Word文档格式.docx
- 文档编号:22847231
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:84
- 大小:882.86KB
文件操作系统课程设计西安交大城院Word文档格式.docx
《文件操作系统课程设计西安交大城院Word文档格式.docx》由会员分享,可在线阅读,更多相关《文件操作系统课程设计西安交大城院Word文档格式.docx(84页珍藏版)》请在冰豆网上搜索。
//用户文件目录表中有无文件的标志
}*curuser=NULL,*elseuser=NULL;
●“用户文件目录表项”UFD类型数据结构:
定义UFD表中的数据块类型(数据块在文件username.exe文件中的存放形式)
structUFD
charfilename[32];
//文件名
intsafecode;
//文件访问权限值
longlength;
//文件长度
}*curfile=NULL;
3.1.2功能设计
该文件系统是一个多用户,多任务的文件系统.对用户和用户的文件数目并没有上限.也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制.
该系统可以支持的操作命令如下:
●cls——用户注销命令.当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面.//没有回到登陆界面只是清屏了
命令格式:
bye
●close——删除用户注册信息命令.执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除.命令执行完成后返回登陆界面.
close
●create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名.该文件的管理信息登记在用户文件信息管理模块中.执行完该命令后回到执行命令行.
create>
file1
其中:
”>
“符为提示符,file1为要创建的文件名.
●delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行.
delete>
file1
file1为要删除的文件名.
●list——显示当前注册目录下的所有文件信息,包括文件名,文件长度,文件操作权限.
list
●chmod——改变某个文件的执行权限,但前提是该文件是该用户目录下的文件.
chmod>
file1.
33:
其他用户既有对该文件的读权限又有对该文件的写权限
32:
只能读不能写
31:
只能写不能读
30:
既不能读又不能写
问题:
只是有提示没有权限,但是仍能正常的对文件的读写
file1为要授权的文件名.
●open——在window界面下打开某个文件.执行该命令后,文件file1将用在windows界面下的文件形式打开.用户可以在这个方式中对文件进行修改,并将修改后的内容保存.
open>
file1为要打开的文件名.
●read——读文件信息.将文件信息读入并显示在终端上.
read>
file1为要读的文件名.
●write——向某个文件写入新的信息.用户可以选择用覆盖原来内容的方式或和在文件的末尾追加新信息的方式写入信息.当要退出时输入”#”即可.
●…——返回主菜单命令窗口.
3.1.3主要功能模块
●菜单模块:
voidMenu(void)
作用:
显示调用”登陆界面”
●登陆显示模块:
intLoginDisplay()
根据DOS界面提示,用户选择不同的操作
●登陆选择模块:
boolLogin(intSELETE)
通过用户做出的选项执行不同的操作.
●显示当前用户文件目录表模块:
voidDisplayUFD()
显示出当前用户目录表中的文件清单(文件名,文件长度,访问权限)
●分离|识别用户命令模块:
voidCommand()
将用户输入的命令进行分解,已提供操作系统命令的识别和执行.
用户名命令字符串=“命令关键字字符串”+”目标文件名”
●系统命令初始化模块:
voidKeyWord()
将用户自定义的系统命令,初始化依次(此处的初始化工作,中的命令是按照ASCII码值的大小进行排序的,便于Command()函数更好的利用”快速查找算法对用户输入命令的识别操作).
●命令执行模块:
voidExecute(inti,intlen,intcmdset)
将Command()函数处理过的用户命令的种类的不同,选择调用不同的文件操作函数,实现不同的功能.
●文件访问权限设置模块:
voidChangeMod()
修改当前用户文件目录中的文件的访问权限(共四种(只读,只写,既能读又能写,不能读又不能写))
●删除用户模块:
voidDeleteUser()//删除用户注册目录的操作
删除当前用户,并删除当前用户文件目录中的所有的文件目录项数据块;
●删除文件目录表模块:
boolClearUserFile()
实现删除用户操作的第一步:
删除当前用户文件目录表UFD中的所有的文件;
即username.exe文件中为NULL(没有文件);
●删除MDF中的主文件目录表项模块:
voidClearUserMes()
●作用:
实现删除用户的第二步,删除主文件目录表MDF中的当前用户(即:
删除LOGIN.exe
文件中的当前用户的数据块;
●双重功能模块(注销模块):
voidByeFile(boolBOOL)
双重功能
⏹BOOL为TRUE时,只是起到刷新LOGIN.exe文件中数据块(数据块)
⏹BOOL为FALSE时:
删除当前用户,服务于DeleteUser()函数,重新LOGIN.exe文件中的数据块;
●创建文件模块:
voidCreatFile()
在当前用户中,新建一个文件
●文件打开模块:
voidOpenFile()
在window模式下打开目标文件;
●书写新建文件的长度模块:
voidWriteLengthToFile(intLen,boolBOOL)作用:
实现将新建的文件(或者新写入的文件)的长度,写入到当前的用户文件目录表(username.exe)文件中的对应的数据快中;
●文件长度变更检查模块:
boolWriteRight(intlen,boolBOOL)
双重功能:
⏹BOOL为TRUE,计算”累加式写入目标文件”后的文件的长度;
⏹BOOL为FALSE,计算”覆盖式写入目标文件”后的文件长度;
●读文件模块:
voidReadFile()
读取目标文件中的内容,显示到Screen中(DOS窗口)
●写文件模块:
voidWriteFile()
将从键盘中键入的字符流(scream)写入到目标文件中;
●读写访问权限查询模块boolQueryMod(boolBOOL)
读|写当前目标文件时,查询当前用户,是否有读|写该文件的权限;
●读写文件查询服务模块boolQueryModElse(boolBOOL,bool&
flag)
是QueryMod()函数的延伸功能模块,进行深层次的权限查询,即查询MDF中(此处指LOGIN.exe文件中)”非当前用户文件目录表中”是否存在目标文件,存在时,是否允许当前用户的读|写权限操作.
3.2总体设计流程图
图1总体设计流程图
4.文件系统功能模块详细设计流程图
4.1菜单模块:
(intLoginDisplay())
图2菜单模块
4.2注册用户模块
图3用户注册模块
4.3用户登陆模块(boolLogin(intSELETE))
图4用户登陆模块
4.4用户查询模块((voidList_All_user(void)))
图5用户查询模块
4.5创建文件模块((voidList_All_user(void)))
图6穿件文件模块
4.6文件查找模块(voidDisplayUFD())
图7文件查找模块
4.7文件删除模块(voidDeleteFile())
图8文件删除模块
4.8更改文件读写权限模块(voidChangeMod())
图9权限设置模块
4.9写文件模块(voidWriteFile())
图10写文件模块
4.10读文件模块(voidReadFile())
图11读文件模块
5.实验运行结果
5.1菜单模块运行结果
图11菜单显示
5.2注册模块运行结果
●成功注册时显示如下:
图12菜单显示
●重复注册时,显示如下:
图13注册用户显示
5.3登陆模块运行结果
●已注册登陆运行结果:
图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修改内容说明
●修改内容1:
原程序Bye命令的问题(只起到了清屏的作用,也没有起到返回到主页面的作用;
更没有起到注销的作用.)
⏹我的修改:
◆分析错误的原因:
bye:
该命令调用的是voidByeFile(boolBOOL)
该函数是双功能函数:
1.BOOL=true,是注销用户,相当刷新了一次LOGIN.exe(MFD)(原程序中,参数不正确)
2.BOOL=false.则是删除了当前用户,相当于更新了一次LOGIN.exe(MFD)文件
◆改进:
--新增cls命令(纠正了ByeFile()函数的参数)
1.实现注销操作的功能:
自定义:
cls命令,替换了bye命令,实现用户文件目录的刷新操作;
又因2.实现清屏的功能:
cls命令中添加了(system(“cls”)库函数,也起到了清屏作用)
●修改内容2:
原程序中的权限设置函数没有起到改用的作用(虽说应经设置了访问权限,但是非当前用户仍能访问该文件)
⏹Chmod命令涉及到了两个函数:
◆boolQueryMod(boolBOOL):
它的作用是,第一层检查文件的读写访问权限(只在当前用户文件目录表中查找)+使用第二层权限检查的结果(在非当前用户目录中权限监测的结构);
我的更改:
只动了2句话:
1.if((BOOL_1==QueryModElse(BOOL,flag)))//查找
returntrue;
改为:
if(QueryModElse(BOOL,flag))
2.if(feof(fp1)&
&
!
BOOL_1)
returnfalse;
1.if(feof(fp1)&
QueryModElse(BOOL,flag))
//--------------------定义的变量BOOL_1没有使用
◆boolQueryModElse(boolBOOL,bool&
flag):
该函数是在非当前用户的用户文件目录中,查找目标文件的权限,是否允许当前用户操作;
●修改内容3:
原程序,在第一次注册用户后,登陆成功后新建的一个文件,在第二次登陆后,在用list命令查看时,系统中已存在该文件,但是显示为:
当前用户文件目录中为空(已经存在文件不显示);
⏹List命令显示文件提示无文件涉及到两个地方
◆新用户注册时,curuser->
filepoint=false;
fwrite(curuser,sizeof(MFD),1,fp);
◆voidDisplayUFD()函数中:
if(curuser->
filepoint==false)//cout<
<
“\n用户“<
curuser->
username<
“文件夹是空的”<
endl;
●修改内容4:
原程序中,新建的用户,在当前用户文件目录中,新建了一个新的文件,立即用list命令查看UFD清单时,会找不到该文件
⏹错误的原因:
voidCreatFile()该函数出现了问题:
当前用户在当前用户文件目录表中,创建了一个新的文件后,没有更新LOGIN.exe文件(没有清除当前用户的curuser->
filepoint=true;
没有保存到LOGIN.exe文件中
在该函数的末尾天剑了更新MDF表(LOGIN.exe)文件即可
ByeFile(true);
//最后:
更新MDF()//自己添加的东西
●修改内容5:
原程序很多地方不符合常理:
比如说删除一个不存在的文件也能删除成功,修改一个不存在的文件的权限也能修改成功;
在对一个文件的增删改查等操作的时候,没有对当前用文件目录中的文件进行查找操作!
自定义了一个在当前用户文件目录中,按文件名查询的函数voidQueryFile(void),返回值为true,当前用户中有该文件’返回值为false,当前用户中无此文件;
这也再将该函数加入到其他功能函数首,执行前,进行一次判断(是否有目标文件,若是没有该文件,退出操作当前操作);
6.2实验改进
●新添加系统命令:
”...”
说明:
”…”-----改该命令,作用是返回到根菜单目录,已进行其他用户的[登陆|注册|查看|帮助文档|退出系统]等操作;
●新增函数QueryFile(void):
用户目录表中,文件存在检查函数:
QueryFile()函数实现,在进行文件操作[文件曾|删|改|查|读|写等操作之前,先判断是否有该文件,进而再进行相应的操作,确保命令真实有效]
●自定义用户函数:
voidMenu(void)函数
使得返回到跟菜单跟方便,主函数更简单,模块化更强;
●新增帮助文档:
可以对当前文件系统的操作指令集展示给用户!
6.3作者物语
●该系统,是在原来的基础上,进行的,目的不是为了增加其功能,而是为了完善已有功能,了解对”二级文件目录结构”的增/删/改/查/权限设置等操作的实现过程;
●由于自己边加注释,边改程序(自己认为原程序有不通的地方,就随笔更改了,因此可能现在找到的程序中的bug要远远少于我自己做的改动!
)
●我认为文件操作系统(Filesystem)数据结构设计的不是很合理,一下提出自己的理解和猜想
我认为,系统主文件目录表(LOGIN.exe)中的数据块,应该采用链表的形式,进行存储,这应便于实现用户的:
增/删/改/查等的操作;
用户文件目录表中(username.exe)文件中,数据块之间,也应该采用链表的形式存放,这样也实现了方便用户的增/删/改/查操作,减少了代码量和程序员的负担.
6.3实现程序(用小六字体打印).
/*****************************************************************
*文件名:
Simple_file_system.c
*功能:
简单文件管理系统模拟程序
*作者:
计算机001-曹春
*指导老师:
西安交通大学陆丽娜教授
*时间:
2013年3月31日
******************************************************************/
#include<
iostream.h>
stdio.h>
stdlib.h>
string.h>
#include"
conio.h"
dos.h>
#defineNULL0
#definekeynum11//共有11中系统命令
#definegetspace(type)(type*)malloc(sizeof(type))//申请磁盘空间大小为"
type类型变量"
所占磁盘大小的空间
charcmd[64];
//存放用户输入命令
charbuffer[36];
//文件名称长度不能超过36个字符
charuser[32];
//存放当前登陆的用户名
//经典定义:
typedefcharALFA[12];
ALFAKWORD[keynum];
charAdministrator[20];
//以上两句话的意思:
就是说--KWORD中的每一个元素相当于一个长度为12的字符数组,而且数组名为KWORD[i]
//------------------------------------------------------------------------------------------------
structUFD{//用户文件管理模块
//文件名
//文件保护码
//文件长度
//用户文件目录表(username.exe)-->
就是将一个个儿UFD类型的用户文件目录表(username.exe)项(即UFD类型的数据块)依次写到了一个文件中(usernamespace.exe)
{//用户登陆信息管理模块
boolfilepoint;
//用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件
//MFD主文件目录中存放的值只是用户的名称
//---------------------主文件目录表---就是将一个个MDF类型主文件目录表(即MDF类型的数据块)项写到了一个文件中(LOGIN.exe)
typedefUFDUFD;
typedefMFDMFD;
voidDisplayUFD();
voidByeFile(boolBOOL);
intLoginDisplay();
voidMenu(void);
boolQueryFile(void);
voidWriteLengthToFile(intLen,boolBOOL);
voidmain();
voidListAllFile()//显示当前用户文件目录下的所有的文件UFD表
{
DisplayUFD();
}
boolQueryFile(void)//查找当前用户中是否存在目标文件
FILE*fp;
charuser[50];
UFD*ufd=getspace(UFD);
strcpy(user,curuser->
username);
strcat(user,"
.exe"
);
//得到当前用户的用户名username.exe文件
if((fp=fopen(user,"
rb"
))==NULL)
{
fclose(fp);
returnfalse;
}
while
(1)
fread(ufd,sizeof(UFD),1,fp);
//逐个的读取当前用户文件目录中的文件
if((strcmp(ufd->
filename,buffer)==0)&
!
feof(fp))//在当前用户文件目录表中找到了该文件(即该文件属于本用户文件目录表)
{
fclose(fp);
returntrue;
//返回真值-->
当前用户目录下找到了该文件
}
else
{
returnfalse;
boolQueryModElse(boolBOOL,bool&
flag)//查询"
当前被操作的文件"
是否是LOGIN.exe文件中"
非当前用户文件目录表"
以外的用户文件目录表中的文件
//若是其他用户文件目录中的文件,再检查是否允许被当前用户读或者写?
?
//elseuser表示除当前用户外的任何一个用户文件目录表文件
strcpy(user,elseuser->
//得到"
非当前:
用户文件目录表名
))==NULL)//以"
读方式"
打开非当前用户的文件目录表时,文件发生错误!
fclose
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 操作系统 课程设计 西安 大城