1、文件系统实验报告 试验四 文件系统一、 实验目的1、 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解。2、 要求设计一个n个用户的文件系统,每次用户可以保存M个文件。用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。二、 实验题目:采用二级目录结构实现磁盘文件操作。要求:1普通文件的目录项包括文件名,文件类型,文件长度,指向文件容的指针容。2目录文件的目录项包括目录名,指向下一级目录块的指针容。假定每个目录文件最多只能占用一个块
2、;3程序功能方面的要求: 需要实现一个命令行操作界面,包含如下命令: 4程序实现方面的要求: (1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。 (2)、界面友好,程序强壮。 (3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。不要自己设计命令或者附加不要求的功能。 三.实验源程序文件名: Filesystem_s.cpp 执行文件名: Project1.exe 四.实验分析1)总论:该系统是一个多用户、多任务的实时操作系统。对用户和用户的文件数目并没有上限。也就是说该系统允许
3、任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。该系统的操作命令如下:1、 bye-用户注销命令。当使用该命令时,用户退出系统。命令格式:runbye系统注销该用户并回到登陆界面。 2、 close-删除用户注册信息命令。执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。命令格式:runclose.完成后返回登陆界面。3、 create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。该文件的管理信息登录到用户文件信息管理模块中。命令格式:runcreatefile1。其中file1为要创建的文件名称。执行完该命令后回到执行命令行。4、 delet
4、e-删除当前用户目录下的一个文件。命令格式:rundeletefile1。返回命令行。5、 list-显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。命令格式:runlist。6、 chmod-改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。命令格式:runchmodfile1。7、 open-在window界面下打开某个文件。命令格:runopenfile1。执行该命令后,文件file1将用在windows界面下的文件形式打开。用户可以在这个方式中对文件进行修改,并将修改后的容保存。8、 read-读文件信息。将文件信息读入并显示在终端。命令格式:runre
5、adfile1。9、 write-向某个文件写入新的信息。用户可以选择用覆盖原来容的方式和在文件的末尾插入新信息的方式写入信息。 2)_系统采用二级文件目录。设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。在主目录中又注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。用户文件目录用用户名作为文件名保存在磁盘,以便检索时方便对应。在用户文件目录中保存着该目录下所有的文件的文件名称、保护码、文件长度。3) 该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建写入、读出、删除等效果。4) 实验流程图1创建文件删除文件打开文件读文件写文件改变权限显示文
6、件保存当前主目录删除用户返回主界面输入命令5)源程序: #include#include#include#include#include conio.h#include#define NULL 0#define keynum 10#define getspace(type) (type*)malloc(sizeof(type)char cmd64; /存放用户输入命令char buffer36;/char user32;/存放当前登陆的用户名typedef char ALFA12;ALFA KWORDkeynum;struct UFD/用户文件管理模块 char filename32; /文件
7、名 int safecode; /文件保护码 long length; /文件长度*curfile = NULL;struct MFD/用户登陆信息管理模块 char username32; /用户名 bool filepoint; /用户目录下的文件指针,false表示目录为空*curuser = NULL,*elseuser=NULL;typedef UFD UFD;typedef MFD MFD;void main();void KeyWord()/初始化命令关键字 strcpy(KWORD 1,bye); strcpy(KWORD 2,chmod); strcpy(KWORD 3,cl
8、ose); strcpy(KWORD 4,create); strcpy(KWORD 5,delete); strcpy(KWORD 6,list); strcpy(KWORD 7,open); strcpy(KWORD 8,read); strcpy(KWORD 9,write); int LoginDisplay() /登陆选项操作函数 int SELETE_1 = 0; do cout *请选择操作*n1、用户登陆 2、用户注册 0、退出SELETE_1; while(SELETE_12); system(cls); return SELETE_1;bool Login(int SELE
9、TE)/用户登陆,注册函数 FILE *fp,*fp1,*fp2; char name12; switch(SELETE) case 1:/用户登陆 if(fp = fopen(LOGIN.exe,rb) = NULL)/打开用户注册目录管理文件 coutn错误:不能打开登陆文件。endl; getch();system(cls); return false; curuser = getspace(MFD); coutname; /输入用户登陆名 while(!feof(fp) /检查该用户是否合法 fread(curuser,sizeof(MFD),1,fp); if(strcmp(curu
10、ser-username,name)=0) break; if(feof(fp) /如果没有找到跟当前登陆用户名相同的管理信息,提示出错 coutn错误:该用户不存在。endl; fclose(fp); return false; else fclose(fp); return true; break; case 2: /新用户注册 if(fp=fopen(LOGIN.exe,ab)=NULL)/如果登陆信息管理文件不存在 fp=fopen(LOGIN.exe,wb+); /创建该信息管理文件 char name12; curuser = getspace(MFD); while(1) cou
11、tn *新用户注册*endl; coutname; /输入用户注册名 fp1 = fopen(LOGIN.exe,rb); while(!feof(fp1)/查看该用户名是否被别的用户占用 fread(curuser,sizeof(MFD),1,fp1); if(strcmp(curuser-username,name) = 0)/该名称已经被使用 coutn该用户已经存在,请重新输入!username,name); curuser-filepoint = NULL; fwrite(curuser,sizeof(MFD),1,fp); strcpy(user,curuser-username)
12、;/生成用户文件管理模块 strcat(user,.exe); /用于管理用户目录下的各个文件 fp2=fopen(user,wb+); fclose(fp2); coutn注册成功!endl; /提示注册成功 fclose(fp1); fclose(fp); break; fp = fopen(LOGIN.exe,rb); /显示当前注册用户的名称 while(1) fread(curuser,sizeof(MFD),1,fp); if(feof(fp) break; coutusernamefilepoint = false)/当前用户目录下没有任何文件存在 coutn用户 usernam
13、e 文件夹是空的username); strcat(filename,.exe); if(fp=fopen(filename,rb)=NULL)/打开用户文件信息管理模块 coutn无法打开用户:username 的文件!endl; getch(); return; else /读入并将用户全部文件信息打印在终端 cout用户:username目录下的文件:endl; UFD *ufd; int i=0; ufd = getspace(UFD); /申请存放用户文件模块的空间 while(1) fread(ufd,sizeof(UFD),1,fp); if(feof(fp)/全部输出完毕,结束
14、 break; else/打印信息 coutfilenametlengthtsafecodeendl; fclose(fp); void ByeFile(bool BOOL)/注销函数,调用次函数用户可以退出系统 FILE *infile,*outfile; char out50; strcpy(out,outfilelocate.exe); if(infile=fopen(LOGIN.exe,rb)=NULL) coutn保存错误。; / fclose(infile); return; else if(outfile=fopen(out,wb+)=NULL)/申请一个缓冲区管理模块 /存放用
15、户更新后的全部信息 coutusername,curuser-username)=0) if(BOOL)/更新当前用户信息的操作 fwrite(curuser,sizeof(MFD),1,outfile); else continue;/如果用户想把自己的注册目录从系统中彻底删除 /则执行该操作 else fwrite(mfd,sizeof(MFD),1,outfile);/写入新的模块 fclose(infile);fclose(outfile); remove(LOGIN.exe);/将旧的该用户的文件管理模块删除 rename(out,LOGIN.exe);/将新的用户的文件管理模块重命
16、名为用户目录下的管理模块 system(cls); main();bool ClearUserFile()/用户要将自己的注册目录从系统彻底删除/首先将该用户目录下的全部文件删除 FILE *fp; char file50; strcpy(file,curuser-username); strcat(file,.exe); if(fp=fopen(file,rb)=NULL) /打开用户文件信息管理模块 / fclose(fp); coutfilename);/删除文件 fclose(fp); return true; void ClearUserMes()/删除用户全部信息 char nam
17、e50; strcpy(name,curuser-username); strcat(name,.exe); remove(name); /从磁盘中删除用户文件信息管理模块 ByeFile(false);/更新系统的用户登陆信息管理模块void DeleteUser()/删除用户注册目录的操作 char ch;coutn该操作将会是你在系统所有信息删除,下次登陆时你必须重新申请用户名!endl; coutn你确定要删除你在系统中的注册信息吗?Y/Nch; switch(ch)/提示用户确认删除 case Y: case y: if(ClearUserFile()/如果用户的全部文件已经删除了
18、/则可以将该用户的文件信息管理模块也从磁盘中删除 /以免在没完全删除文件却删了该文件信息管理模块 /使得这些文件无法再进行管理造成磁盘空间的浪费 ClearUserMes();/删除文件信息管理模块 break; default: coutfilepoint=true; if(fp=fopen(buffer,r)=NULL)/如果没有跟用户输入文件名相同的文件 if(fp=fopen(buffer,w)=NULL) coutn创建文件失败!; / fclose(fp); return; fclose(fp); else /用户要创建的文件已经存在 coutch; switch(ch) case
19、 Y: case y: coutbuffer; strcat(buffer,.txt); fclose(fp); if(fp=fopen(buffer,w)=NULL) coutusername); strcat(user,.exe); curfile = getspace(UFD); strcpy(curfile-filename,buffer);/文件名 curfile-length=0; /该文件长度为零 curfile-safecode=30; /设置该文件的默认权限 /11 00,文件主有读和写权,其他用户没有读写权 if(fp=fopen(user,ab)=NULL) coutn错
20、误:你可能不是合法用户。endl; getch(); else fwrite(curfile,sizeof(UFD),1,fp);/将该文件信息写入用户文件信息管理模块中 coutn文件 filename 创建成功!; fclose(fp);void DeleteFile()/删除当前目录下一个文件的操作 char ch; FILE *infile,*outfile; coutn确定要删除文件:buffer Y/Nch;/提示用户确认删除 switch(ch) case Y: case y:/更新用户文件信息管理模块,这里同样使用缓冲区模块来更新 /方法与上面将到的类似 char out50,
21、in50; strcpy(out,outfilelocate.exe); strcpy(in,curuser-username); strcat(in,.exe); if(infile=fopen(in,rb)=NULL)/打开该用户的文件信息管理模块 coutn保存错误。; /fclose(infile); return; else if(outfile=fopen(out,wb+)=NULL) coutfilename,buffer)=0)/要进行更新的信息 continue; else fwrite(ufd,sizeof(UFD),1,outfile);/写入新模块 fclose(inf
22、ile);fclose(outfile); remove(in);/在磁盘移除就模块 rename(out,in); /新模块命名为当前用户文件信息管理模块 remove(buffer);/从磁盘中删除该文件 break; default: break; void ListAllFile()/显示当前用户目录下的文件信息 DisplayUFD();void OpenFile()/在window模式下打开该文件 system(buffer);/buffer为文件名,如:file1.txtbool QueryModElse(bool BOOL,bool &flag)/查询其它用户目录下文件的文件/当该文件的权限允许当前用户对其执行有关操作时,返回ture FILE *fp; char user50; UFD *ufd = getspace(UFD);/elseuser表示除当前用户外的所有用户注册目录 strcpy(user,elseuser-username);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1