文件系统实验报告.docx
《文件系统实验报告.docx》由会员分享,可在线阅读,更多相关《文件系统实验报告.docx(40页珍藏版)》请在冰点文库上搜索。
文件系统实验报告
试验四文件系统
一、实验目的
1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验题目:
采用二级目录结构实现磁盘文件操作。
要求:
1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件容的指针容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针容。
假定每个目录文件最多只能占用一个块;
3.程序功能方面的要求:
需要实现一个命令行操作界面,包含如下命令:
4.程序实现方面的要求:
(1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。
(2)、界面友好,程序强壮。
(3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。
不要自己设计命令或者附加不要求的功能。
三.实验源程序文件名:
Filesystem_s.cpp
执行文件名:
Project1.exe
四.实验分析
1)总论:
该系统是一个多用户、多任务的实时操作系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统的操作命令如下:
1、bye-用户注销命令。
当使用该命令时,用户退出系统。
命令格式:
run\bye↙系统注销该用户并回到登陆界面。
2、close-删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令格式:
run\close↙.完成后返回登陆界面。
3、create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。
该文件的管理信息登录到用户文件信息管理模块中。
命令格式:
run\create>file1↙。
其中file1为要创建的文件名称。
执行完该命令后回到执行命令行。
4、delete-删除当前用户目录下的一个文件。
命令格式:
run\delete>file1↙。
返回命令行。
5、list-显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
命令格式:
run\list↙。
6、chmod-改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。
命令格式:
run\chmod>file1↙。
7、open-在window界面下打开某个文件。
命令格:
run\open>file1↙。
执行该命令后,文件file1将用在windows界面下的文件形式打开。
用户可以在这个方式中对文件进行修改,并将修改后的容保存。
8、read-读文件信息。
将文件信息读入并显示在终端。
命令格式:
run\read>file1↙。
9、write-向某个文件写入新的信息。
用户可以选择用覆盖原来容的方式和在文件的末尾插入新信息的方式写入信息。
2)_系统采用二级文件目录。
设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。
在主目录中又注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。
用户文件目录用用户名作为文件名保存在磁盘,以便检索时方便对应。
在用户文件目录中保存着该目录下所有的文件的文件名称、保护码、文件长度。
3)该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建写入、读出、删除等效果。
4)实验流程图
1
创建文件
删除文件
打开文件
读文件
写文件
改变权限
显示文件
保存当前主目录
删除用户
返回主界面
输入命令
5)源程序:
#include
#include
#include
#include
#include"conio.h"
#include
#defineNULL0
#definekeynum10
#definegetspace(type)(type*)malloc(sizeof(type))
charcmd[64];//存放用户输入命令
charbuffer[36];//
charuser[32];//存放当前登陆的用户名
typedefcharALFA[12];
ALFAKWORD[keynum];
structUFD{//用户文件管理模块
charfilename[32];//文件名
intsafecode;//文件保护码
longlength;//文件长度
}*curfile=NULL;
structMFD{//用户登陆信息管理模块
charusername[32];//用户名
boolfilepoint;//用户目录下的文件指针,false表示目录为空
}*curuser=NULL,*elseuser=NULL;
typedefUFDUFD;
typedefMFDMFD;
voidmain();
voidKeyWord()//初始化命令关键字
{
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)
{
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);
cout<<"\n注册成功!
"<fclose(fp1);
fclose(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");
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];
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);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");//将新的用户的文件管理模块重命名为用户目录下的管理模块
}
}
system("cls");
main();
}
boolClearUserFile()//用户要将自己的注册目录从系统彻底删除
//首先将该用户目录下的全部文件删除
{
FILE*fp;
charfile[50];
strcpy(file,curuser->username);
strcat(file,".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];
strcpy(name,curuser->username);
strcat(name,".exe");
remove(name);//从磁盘中删除用户文件信息管理模块
ByeFile(false);//更新系统的用户登陆信息管理模块
}
voidDeleteUser()//删除用户注册目录的操作
{
charch;
cout<<"\n该操作将会是你在系统所有信息删除,下次登陆时你必须重新申请用户名!
"<cout<<"\n你确定要删除你在系统中的注册信息吗?
Y/N"<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
{//用户要创建的文件已经存在
cout<<"\n该文件已经存在,创建另一个文件?
Y/N";
charch;
cin>>ch;
switch(ch)
{
case'Y':
case'y':
cout<<"\n输入新文件名:
";
cin>>buffer;
strcat(buffer,".txt");
fclose(fp);
if((fp=fopen(buffer,"w"))==NULL)
{
cout<<"\n创建文件失败!
";
//fclose(fp);
return;
}
fclose(fp);
break;
default:
fclose(fp);
return;
}
}
strcpy(user,curuser->username);
strcat(user,".exe");
curfile=getspace(UFD);
strcpy(curfile->filename,buffer);//文件名
curfile->length=0;//该文件长度为零
curfile->safecode=30;//设置该文件的默认权限
//1100,文件主有读和写权,其他用户没有读写权
if((fp=fopen(user,"ab"))==NULL)
{
cout<<"\n错误:
你可能不是合法用户。
"<getch();
}
else
{
fwrite(curfile,sizeof(UFD),1,fp);//将该文件信息写入用户文件信息管理模块中
cout<<"\n文件"<filename<<"创建成功!
";
}
fclose(fp);
}
voidDeleteFile()//删除当前目录下一个文件的操作
{
charch;
FILE*infile,*outfile;
cout<<"\n确定要删除文件:
"<cin>>ch;//提示用户确认删除
switch(ch)
{
case'Y':
case'y':
//更新用户文件信息管理模块,这里同样使用缓冲区模块来更新
//方法与上面将到的类似
charout[50],in[50];
strcpy(out,"outfilelocate.exe");
strcpy(in,curuser->username);
strcat(in,".exe");
if((infile=fopen(in,"rb"))==NULL)//打开该用户的文件信息管理模块
{
cout<<"\n保存错误。
";
//fclose(infile);
return;
}
else
{
if((outfile=fopen(out,"wb+"))==NULL)
{
cout<<"\n保存错误。
";//fclose(outfile);
fclose(infile);return;
}
else
{
UFD*ufd=getspace(UFD);
while
(1)
{
fread(ufd,sizeof(UFD),1,infile);//从旧模块读出信息
if(feof(infile))
break;
if((strcmp(ufd->filename,buffer))==0)//要进行更新的信息
continue;
else
fwrite(ufd,sizeof(UFD),1,outfile);//写入新模块
}
fclose(infile);fclose(outfile);
remove(in);//在磁盘移除就模块
rename(out,in);//新模块命名为当前用户文件信息管理模块
}
}
remove(buffer);//从磁盘中删除该文件
break;
default:
break;
}
}
voidListAllFile()//显示当前用户目录下的文件信息
{
DisplayUFD();
}
voidOpenFile()//在window模式下打开该文件
{
system(buffer);//buffer为文件名,如:
file1.txt
}
boolQueryModElse(boolBOOL,bool&flag)//查询其它用户目录下文件的文件
//当该文件的权限允许当前用户对其执行有关操作时,返回ture
{
FILE*fp;
charuser[50];
UFD*ufd=getspace(UFD);//elseuser表示除当前用户外的所有用户注册目录
strcpy(user,elseuser->username);