文件系统实验报告.docx
- 文档编号:5525734
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:33
- 大小:63.52KB
文件系统实验报告.docx
《文件系统实验报告.docx》由会员分享,可在线阅读,更多相关《文件系统实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
文件系统实验报告
试验四文件系统之蔡仲巾千创作
一、
创作时间:
二零二一年六月三十日
二、实验目的
1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程.从而对各种文件把持命令的实质内容和执行过程有比力深入的了解.
2、要求设计一个n个用户的文件系统,每次用户可以保管M个文件.用户在一次运行中只能翻开一个文件,对文件必需设置呵护办法,且至少有create、delete、open、close、read、write等命令.
三、实验题目:
采纳二级目录结构实现磁盘文件把持.
要求:
1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容.
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容.假定每个目录文件最多只能占用一个块;
3.法式功能方面的要求:
需要实现一个命令行把持界面,包括如下命令:
4.法式实现方面的要求:
(1)、对重名(创立时),文件不存在(删除时),目录不存在(改变目录时)等毛病把持情况,法式应该做出相应处置并给犯毛病信息,可是法式不得因此而退出.
(2)、界面友好,法式强壮.
(3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致.不要自己设计命令或者附加不要求的功能.
:
执行文件名:
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)实验流程图
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< getch(); } fclose(fp); returntrue; break; default: returnfalse; break; } } voidDisplayUFD()//打印用户信息,包括用户的各个文件 //名称、长度和把持权限的设置信息 { if(curuser->filepoint==false)//以后用户目录下没有任何文件存在 cout<<"\n用户"< else {//存在文件,将所有文件信息打印在终端 FILE*fp; charfilename[12]; strcpy(filename,curuser->username); strcat(filename,".exe"); if((fp=fopen(filename,"rb"))==NULL)//翻开用户文件信息管理模块 { cout<<"\n无法翻开用户: "< "< getch(); return; } else {//读入并将用户全部文件信息打印在终端 cout<<"用户: "< "< UFD*ufd; inti=0; ufd=getspace(UFD);//申请寄存用户文件模块的空间 while (1) { fread(ufd,sizeof(UFD),1,fp); if(feof(fp))//全部输出完毕,结束 break; else//打印信息 cout< } } 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文件"< "; } 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模式下翻开该文件 { } boolQueryModElse(boolBOOL,bool&flag)//查询其它用户目录下文件的文件 //当该文件的权限允许以后用户对其执行有关把持时,返回ture { FILE*fp; charuser[50]; UFD*ufd=getspace(UFD);//elseuser暗示除以后用户外的所有用户注册目录 strcpy(user,elseuser->username); strcat(user,".exe"); if((fp=fopen(user,"rb"))==NULL){//翻开一个其它的用户文件信息管理模块 //fclose(fp);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件系统 实验 报告