精品一个简单的文件系统的详细设计操作系统毕业论文.docx
《精品一个简单的文件系统的详细设计操作系统毕业论文.docx》由会员分享,可在线阅读,更多相关《精品一个简单的文件系统的详细设计操作系统毕业论文.docx(38页珍藏版)》请在冰豆网上搜索。
![精品一个简单的文件系统的详细设计操作系统毕业论文.docx](https://file1.bdocx.com/fileroot1/2022-12/29/ffe31f90-9796-4881-932f-0b9ed4e809f8/ffe31f90-9796-4881-932f-0b9ed4e809f81.gif)
精品一个简单的文件系统的详细设计操作系统毕业论文
计算机系综合性实验
实验报告
课程名称操作系统实验报告
一个简单的文件系统的详细设计
一个简单的文件系统的详细设计
一、实验目的
(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求
1、根据流程图阅读所给文件系统源程序,并对源程序加以注释(注释量达70%以上)。
2、修改、完善该系统,指出程序的bug。
三、文件系统功能设计
1.功能设计
该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:
①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:
bye
②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:
close
③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:
create>file1
其中:
“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:
delete>file1
其中:
file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
命令格式:
list
⑥chmod——改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。
命令格式:
chmod>file1。
其中:
file1为要授权的文件名。
⑦open——在window界面下打开某个文件。
执行该命令后,文件file1将用在windows界面下的文件形式打开。
用户可以在这个方式中对文件进行修改,并将修改后的内容保存。
命令格式:
open>file1
其中:
file1为要打开的文件名。
⑧read——读文件信息。
将文件信息读入并显示在终端上。
命令格式:
read>file1
其中:
file1为要读的文件名。
⑨write——向某个文件写入新的信息。
用户可以选择用覆盖原来内容的方式或和在文件的末尾追加新信息的方式写入信息。
当要退出时输入“#”即可。
(2)系统采用二级文件目录。
设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。
在主目录中有注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。
用户文件目录采用用户名作为文件名保存于磁盘,以便检索时方便对应。
在用户文件目录中保存着该目录下所有文件的文件名称、保护码、文件长度。
(3)该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建、写入、读出、删除等效果。
2.功能设计实现总体流程
3.主要数据结构
structUFD
{用户文件模块
charfilename[32];文件名
intsafecode;文件保护码
longlength;文件长度
}*curfile=NULL;
这个是用户文件模块数据结构,结构体的名字是:
UFD,在结构体里面定义了三个成员,filename,safecode,length,分别用于存储用户文件的名字,文件保护码,文件的长度,*curfile=NULL;,这是一个结构体类型的指针,开始初始化为NULL.
structMFD
{主文件模块
charusername[32];存放用户名
boolfilepoint;
用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件
}*curuser=NULL,*elseuser=NULL;
这个是主文件模块的数据结构,有两个成员,username,filepoint,分别用于存放用户名,用户目录下面的文件指针.*curuser=NULL,*elseuser=NULL;这两个是主文件的结构体变量,用于访问结构体里面的数据成员
4.主要功能模块
1.intLoginDisplay()登陆选项操作函数
2.boolLogin(intSELETE)用户登陆,注册函数
3.voidDisplayUFD()打印用户信息,包括用户的各个文件
4.voidByeFile(boolBOOL)注销函数,调用次函数用户可以退出系统
5.boolClearUserFile()用户要将自己的注册目录从系统彻底删除
6.voidClearUserMes()删除用户全部信息
7.voidDeleteUser()删除用户注册目录的操作
8.voidCreatFile()在当前用户目录下创建文件
9.voidDeleteFile()删除当前目录下一个文件的操作
10.boolQueryModElse(boolBOOL,bool&flag)
查询其它用户目录下文件的文件
11.boolQueryMod(boolBOOL)查询权限
12.boolWriteRight(intlen,boolBOOL)
查看是否已经正确地写入到该文件信息中,是则返回真值
13.voidWriteLengthToFile(intLen,boolBOOL)
将文件长度写入文件管理模块中
14.voidWriteFile()向文件写入信息的操作
15.voidReadFile()读文件函数
16.voidChangeMod()修改某文件的执行权限
17.voidExecute(inti,intlen,intcmdset)执行命令函数
18.voidCommand()
读取用户输入的命令,并将其转换成系统能识别的命令
5.小组成员及分工
负责人:
姓名
模块
黄新潮
组长分配任务,总结实验心得,分析流程图,给组员讲解
王强
对源程序加以注释、修改
张蒙
对源程序读取,运行,截图,完善
四、文件系统功能模块详细设计流程图
1.intLoginDisplay()登陆选项操作函数
2.boolLogin(intSELETE)用户登陆,注册函数
3.voidDisplayUFD()打印用户信息,包括用户的各个文件
4.voidByeFile(boolBOOL)注销函数,调用次函数用户可以退出系统
5.boolClearUserFile()用户要将自己的注册目录从系统彻底删除
6.voidClearUserMes()删除用户全部信息
7.intDeleteUser()删除用户注册目录的操作
8.voidCreatFile()在当前用户目录下创建文件
9.voidDeleteFile()删除当前目录下一个文件的操作
10.boolQueryModElse(boolBOOL,bool&flag)查询其它用户目录下文件的文件
11.boolQueryMod(boolBOOL)查询权限
12.boolWriteRight(intlen,boolBOOL)查看是否已经正确地写入到该文件信息中,是则返回真值
13.voidWriteLengthToFile(intLen,boolBOOL)将文件长度写入文件管理模块中
14.voidWriteFile()向文件写入信息的操作
15.voidReadFile()读文件函数
16.voidChangeMod()修改某文件的执行权限
17.intExecute(inti,intlen,intcmdset)执行命令函数
18.voidCommand()读取用户输入的命令,并将其转换成系统能识别的命令
五、实验运行结果
*****************************************************************
*文件名:
Simple_file_system.c
*功能:
简单文件管理系统模拟程序
*******************************************************************
#includevoidKeyWord()初始化命令关键字
{
strcpy(KWORD[1],"bye");用户注销命令
strcpy(KWORD[2],"chmod");改变文件的执行权限
strcpy(KWORD[3],"close");删除用户注册信息
strcpy(KWORD[4],"create");在当前目录下创建一个文件
strcpy(KWORD[5],"delete");删除当前用户目录下的一个文件
strcpy(KWORD[6],"list");显示当前注册目录下的所有文件信息
strcpy(KWORD[7],"open");打开文件
strcpy(KWORD[8],"read");读文件信息
strcpy(KWORD[9],"write");向文件写入新的信息
}
intLoginDisplay()登陆选项操作函数
{
intSELETE_1=0;定义整型数存放选项
do循环控制
{
cout<<"*****请选择操作*****\n1、用户登陆2、用户注册0、退出"<cin>>SELETE_1;输入要选择的命令
}while(SELETE_1<0||SELETE_1>2);选项判断
system("cls");清屏
returnSELETE_1;返回选项数
}
boolLogin(intSELETE)用户登陆,注册函数
{
FILE*fp,*fp1,*fp2;定义文件
charname[12];定义数组存放登录名
switch(SELETE)switch选择
{
case1:
用户登陆
if((fp=fopen("LOGIN.exe","rb"))==NULL)打开用户注册目录管理文件
{
cout<<"\n错误:
不能打开登陆文件。
"<getch();读取结束符
system("cls");清屏
returnfalse;返回
}
curuser=getspace(MFD);用户名申请空间
cout<<"\n*****登陆*****\n用户名:
";显示
cin>>name;输入用户登陆名
while(!
feof(fp))检查该用户是否合法
{
fread(curuser,sizeof(MFD),1,fp);文件读取
if(strcmp(curuser->username,name)==0)比较输入用户名是否与存在用户名相同
break;
}
if(feof(fp))如果没有找到跟当前登陆用户名相同的管理信息,执行下列代码
{
cout<<"\n错误:
该用户不存在。
"<该用户不存在”
fclose(fp);关闭文件
returnfalse;返回
}
else
{
fclose(fp);关闭文件
returntrue;返回
}
break;跳出
case2:
新用户注册
if((fp=fopen("LOGIN.exe","ab"))==NULL)如果登陆信息管理文件不存在
fp=fopen("LOGIN.exe","wb+");创建该信息管理文件
charname[12];
curuser=getspace(MFD);用户申请空间
while
(1)
{
cout<<"\n*****新用户注册*****"<cout<<"用户名:
";
cin>>name;输入用户注册名
fp1=fopen("LOGIN.exe","rb");打开登陆文件,只允许读数据
while(!
feof(fp1))查看该用户名是否被别的用户占用
{
fread(curuser,sizeof(MFD),1,fp1);文件读取
if(strcmp(curuser->username,name)==0)
{
cout<<"\n该用户已经存在,请重新输入!
"<getch();读取结束符
break;跳出
}
}
if(feof(fp1))该名称没有被别的用户占用
{
strcpy(curuser->username,name);拷贝输入的用户名到用户名结构体
curuser->filepoint=NULL;文件指针置空
fwrite(curuser,sizeof(MFD),1,fp);用户信息写入文件
strcpy(user,curuser->username);生成用户文件管理模块
strcat(user,".exe");用于管理用户目录下的各个文件
fp2=fopen(user,"wb+");打开文件,允许读和写
fclose(fp2);关闭fp2
cout<<"\n注册成功!
"<LoginDisplay();
fclose(fp1);关闭fp1
fclose(fp);关闭fp
break;
}
}
fp=fopen("LOGIN.exe","rb");显示当前注册用户的名称
while
(1)
{
fread(curuser,sizeof(MFD),1,fp);文件读取
if(feof(fp))检查是否最后用户
break;
cout<username<getch();读取结束符
}
fclose(fp);关闭文件
returntrue;返回
break;
default:
returnfalse;返回
break;返回到上一层
}
}
voidDisplayUFD()打印用户信息,包括用户的各个文件
名称、长度和操作权限的设置信息
{
if(curuser->filepoint==false)当前用户目录下没有任何文件存在
cout<<"\n用户"<username<<"文件夹是空的"<else
{存在文件,将所有文件信息打印在终端
FILE*fp;定义文件
charfilename[12];定义文件名
strcpy(filename,curuser->username);拷贝用户名到定义
strcat(filename,".exe");扩展名.exe
if((fp=fopen(filename,"rb"))==NULL)打开用户文件信息管理模块
{
cout<<"\n无法打开用户:
"<username<<"的文件!
"<getch();读取结束符
return;
}
else
{读入并将用户全部文件信息打印在终端
cout<<"用户:
"<username<<"目录下的文件:
"<UFD*ufd;申请文件模块
inti=0;
ufd=getspace(UFD);申请存放用户文件模块的空间
while
(1)
{
fread(ufd,sizeof(UFD),1,fp);文件读取,把文件信息读到用户中
if(feof(fp))全部输出
break;
else打印信息
cout<filename<<"\t"<length<<"\t"<safecode<}
}
fclose(fp);关闭文件
}
}
voidByeFile(boolBOOL)注销函数,调用次函数用户可以退出系统
{
FILE*infile,*outfile;定义文件
charout[50];定义数组out[50]
strcpy(out,"outfilelocate.exe");拷贝信息到数组
if((infile=fopen("LOGIN.exe","rb"))==NULL)检查是否保存
{
cout<<"\n保存错误。
";fclose(infile);
return;
}
else
{
if((outfile=fopen(out,"wb+"))==NULL)申请一个缓冲区管理模块
存放用户更新后的全部信息
{
cout<<"\n保存错误。
";fclose(outfile);
fclose(infile);关闭文件infile
return;
}
else
{
MFD*mfd=getspace(MFD);申请用户登陆管理并申请空间
while
(1)
{将旧文件管理信息读出,并保存到新的文件信息管理模块中
fread(mfd,sizeof(MFD),1,infile);文件读取,把文件信息读到用户管理中
if(feof(infile))
break;
if((strcmp(mfd->username,curuser->username))==0)判断是否与用户名相同
{
if(BOOL)更新当前用户信息的操作
fwrite(curuser,sizeof(MFD),1,outfile);写文件
elsecontinue;如果用户想把注册目录从系统中彻底删除
则执行该操作
}
else
fwrite(mfd,sizeof(MFD),1,outfile);写入新的模块
}
fclose(infile);
fclose(outfile);关闭文件
remove("LOGIN.exe");将旧的该用户的文件管理模块删除
rename(out,"LOGIN.exe");将新的用户的文件管理模块重命名为用户目录下的
管理模块
}
}
}
boolClearUserFile()用户要将自己的注册目录从系统彻底删除
首先将该用户目录下的全部文件删除
{
FILE*fp;
charfile[50];定义数组file[50]
strcpy(file,curuser->username);拷贝信息到数组
strcat(file,".exe");扩展名.exe
if((fp=fopen(file,"rb"))==NULL)打开用户文件信息管理模块
{
fclose(fp);
cout<<"\n该用户不存在!
";显示该用户不存在!
returntrue;
}
else
{将该用户目录下的文件逐个从磁盘删除
UFD*ufd=getspace(UFD);申请用户文件管理并申请内存
while
(1)
{
fread(ufd,sizeof(UFD),1,fp);文件读取,把文件信息读到用户中
if(feof(fp))判断是否有文件
break;
else
remove(ufd->filename);删除文件
}
fclose(fp);
returntrue;
}
}
voidClearUserMes()删除用户全部信息
{
charname[50];定义数组name[50]
strcpy(name,curuser->username);拷贝用户名到数组
strcat(name,".exe");扩展名.exe
remove(name);从磁盘中删除用户文件信息管理模块
ByeFile(false);更新系统的用户登陆信息管理模块
}
voidDeleteUser()删除用户注册目录的操作
{
intSELETE;定义SELETE
charch;定义ch
cout<<"\n该操作将会是你在系统所有信息删除,下次登陆时你必须重新申请用户名!
"<cout<<"\n你确定要删除你在系统中的注册信息吗?
YN"<cin>>ch;输入选择
switch(ch)提示用户确认删除
{
case'Y':
case'y':
if(ClearUserFile())如果用户的全部文件已经删除了
则可以将该用户的文件信息管理模块也从磁盘中删除
以免在没完全删除文件却删了该文件信息管理模块
使得这些文件无法再进行管理造成磁盘空间的浪费
ClearUserMes();删除文件信息管理模块
break;
default:
cout<<"\n你取消了此操作!
";显示
break;
}
}
voidCreatFile()在当前用户目录下创建文件
{
FILE*fp;定义文件
curuser->filepoint=true;用户目录下的文件指针置真
if((fp=fopen(buffer,"r"))==NULL)如果没有跟用户输入文件名相同的文件
{
if((fp=fopen(buffer,"w"))==NULL)判断文件是否为空
{
cout<<"\n创建文件失败!
";显示
fclose(fp);
return;
}
fclose(fp);关闭文件
}
else
{