1、精品一个简单的文件系统的详细设计操作系统毕业论文计算机系综合性实验实 验 报 告 课程名称 操作系统实验报告 一个简单的文件系统的详细设计一个简单的文件系统的详细设计一、实验目的(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。二、实验要求1、根据流程图阅读所给文件系统源程序,并对源程序加以注释(注释量达70%以上)。2
2、、修改、完善该系统,指出程序的bug。三、文件系统功能设计1. 功能设计该文件系统是一个多用户、多任务的文件系统。对用户和用户的文件数目并没有上限。也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。该系统可以支持的操作命令如下: bye用户注销命令。当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。命令格式: bye close删除用户注册信息命令。执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。命令执行完成后返回登陆界面。命令格式:close create在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。该文件的管
3、理信息登记在用户文件信息管理模块中。执行完该命令后回到执行命令行。命令格式:createfile1其中:“”符为提示符,file1为要创建的文件名。 delete删除当前用户目录下的一个文件,命令执行完毕返回至命令行。命令格式:deletefile1 其中:file1为要删除的文件名。 list显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。命令格式:list chmod改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。命令格式:chmodfile1。其中:file1为要授权的文件名。 open在window界面下打开某个文件。执行该命令后,文件file1将用在
4、windows界面下的文件形式打开。用户可以在这个方式中对文件进行修改,并将修改后的内容保存。命令格式:openfile1其中:file1为要打开的文件名。 read读文件信息。将文件信息读入并显示在终端上。命令格式:readfile1其中:file1为要读的文件名。 write向某个文件写入新的信息。用户可以选择用覆盖原来内容的方式或和在文件的末尾追加新信息的方式写入信息。 当要退出时输入“#”即可。(2)系统采用二级文件目录。设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。在主目录中有注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。用户文件目录采用用
5、户名作为文件名保存于磁盘,以便检索时方便对应。在用户文件目录中保存着该目录下所有文件的文件名称、保护码、文件长度。(3)该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建、写入、读出、删除等效果。2. 功能设计实现总体流程3. 主要数据结构struct UFD用户文件模块 char filename32; 文件名 int safecode; 文件保护码 long length; 文件长度*curfile = NULL;这个是用户文件模块数据结构,结构体的名字是:UFD,在结构体里面定义了三个成员,filename,safecode,length,分别用于存储用户文件的名字,文件保
6、护码,文件的长度, *curfile = NULL;,这是一个结构体类型的指针,开始初始化为NULL.struct MFD主文件模块 char username32; 存放用户名 bool filepoint; 用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件*curuser = NULL,*elseuser=NULL;这个是主文件模块的数据结构,有两个成员,username,filepoint,分别用于存放用户名,用户目录下面的文件指针. *curuser = NULL,*elseuser=NULL;这两个是主文件的结构体变量,用于访问结构体里面的数据成员4. 主要
7、功能模块 1. int LoginDisplay() 登陆选项操作函数2. bool Login(int SELETE)用户登陆,注册函数3. void DisplayUFD() 打印用户信息,包括用户的各个文件4. void ByeFile(bool BOOL)注销函数,调用次函数用户可以退出系统5. bool ClearUserFile()用户要将自己的注册目录从系统彻底删除6. void ClearUserMes()删除用户全部信息7. void DeleteUser()删除用户注册目录的操作8. void CreatFile()在当前用户目录下创建文件9. void DeleteFil
8、e() 删除当前目录下一个文件的操作10. bool QueryModElse(bool BOOL,bool &flag)查询其它用户目录下文件的文件11. bool QueryMod(bool BOOL)查询权限12. bool WriteRight(int len,bool BOOL) 查看是否已经正确地写入到该文件信息中,是则返回真值13. void WriteLengthToFile(int Len,bool BOOL)将文件长度写入文件管理模块中14. void WriteFile()向文件写入信息的操作15. void ReadFile()读文件函数16. void ChangeM
9、od()修改某文件的执行权限17. void Execute(int i,int len,int cmdset)执行命令函数18. void Command()读取用户输入的命令,并将其转换成系统能识别的命令5小组成员及分工 负责人:姓名模 块黄新潮组长分配任务,总结实验心得,分析流程图,给组员讲解王强对源程序加以注释、修改张蒙对源程序读取,运行,截图,完善四、文件系统功能模块详细设计流程图1. int LoginDisplay() 登陆选项操作函数 2. bool Login(int SELETE)用户登陆,注册函数3. void DisplayUFD() 打印用户信息,包括用户的各个文件4
10、. void ByeFile(bool BOOL)注销函数,调用次函数用户可以退出系统5. bool ClearUserFile()用户要将自己的注册目录从系统彻底删除6. void ClearUserMes()删除用户全部信息7. int DeleteUser()删除用户注册目录的操作8. void CreatFile()在当前用户目录下创建文件9. void DeleteFile() 删除当前目录下一个文件的操作10. bool QueryModElse(bool BOOL,bool &flag)查询其它用户目录下文件的文件11. bool QueryMod(bool BOOL)查询权限1
11、2. bool WriteRight(int len,bool BOOL) 查看是否已经正确地写入到该文件信息中,是则返回真值13. void WriteLengthToFile(int Len,bool BOOL)将文件长度写入文件管理模块中14. void WriteFile()向文件写入信息的操作15. void ReadFile()读文件函数16. void ChangeMod()修改某文件的执行权限17. int Execute(int i,int len,int cmdset)执行命令函数18. void Command()读取用户输入的命令,并将其转换成系统能识别的命令五、实验运
12、行结果* * 文件名: Simple_file_system.c* 功 能: 简单文件管理系统模拟程序 *#includeiostream.();void KeyWord()初始化命令关键字 strcpy(KWORD 1,bye); 用户注销命令 strcpy(KWORD 2,chmod); 改变文件的执行权限 strcpy(KWORD 3,close); 删除用户注册信息 strcpy(KWORD 4,create); 在当前目录下创建一个文件 strcpy(KWORD 5,delete); 删除当前用户目录下的一个文件 strcpy(KWORD 6,list); 显示当前注册目录下的所有文
13、件信息 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 SELETE)用户登陆,注册函数 F
14、ILE *fp,*fp1,*fp2; 定义文件 char name12; 定义数组存放登录名 switch(SELETE) switch选择 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,si
15、zeof(MFD),1,fp); 文件读取 if(strcmp(curuser-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)如果登陆信息管理文件不存在
16、fp=fopen(LOGIN.exe,wb+); 创建该信息管理文件 char name12; curuser = getspace(MFD); 用户申请空间 while(1) coutn *新用户注册*endl; coutname; 输入用户注册名 fp1 = fopen(LOGIN.exe,rb); 打开登陆文件,只允许读数据 while(!feof(fp1)查看该用户名是否被别的用户占用 fread(curuser,sizeof(MFD),1,fp1); 文件读取 if(strcmp(curuser-username,name) = 0) coutn该用户已经存在,请重新输入!usern
17、ame,name); 拷贝输入的用户名到用户名结构体 curuser-filepoint = NULL; 文件指针置空 fwrite(curuser,sizeof(MFD),1,fp); 用户信息写入文件 strcpy(user,curuser-username); 生成用户文件管理模块 strcat(user,.exe); 用于管理用户目录下的各个文件 fp2=fopen(user,wb+); 打开文件,允许读和写 fclose(fp2); 关闭fp2 coutn注册成功!endl; 提示注册成功 LoginDisplay(); fclose(fp1); 关闭fp1 fclose(fp);
18、关闭fp break; fp = fopen(LOGIN.exe,rb); 显示当前注册用户的名称 while(1) fread(curuser,sizeof(MFD),1,fp); 文件读取 if(feof(fp) 检查是否最后用户 break; coutusernamefilepoint = false) 当前用户目录下没有任何文件存在 coutn用户 username 文件夹是空的username); 拷贝用户名到定义 strcat(filename,.exe); 扩展名.exe if(fp=fopen(filename,rb)=NULL) 打开用户文件信息管理模块 coutn无法打开用
19、户: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) 全部输出 break; else 打印信息 coutfilenametlengthtsafecodeendl; 输出文件信息 fclose(fp);
20、关闭文件 void ByeFile(bool BOOL)注销函数,调用次函数用户可以退出系统 FILE *infile,*outfile; 定义文件 char out50; 定义数组out50 strcpy(out,outfilelocate.exe); 拷贝信息到数组 if(infile=fopen(LOGIN.exe,rb)=NULL)检查是否保存 coutn保存错误。; fclose(infile); return; else if(outfile=fopen(out,wb+)=NULL) 申请一个缓冲区管理模块 存放用户更新后的全部信息 coutusername,curuser-use
21、rname)=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); 将新的用户的文件管理模块重命名为用户目录下的管理模块 bool Cl
22、earUserFile()用户要将自己的注册目录从系统彻底删除首先将该用户目录下的全部文件删除 FILE *fp; char file50; 定义数组file50 strcpy(file,curuser-username); 拷贝信息到数组 strcat(file,.exe); 扩展名.exe if(fp=fopen(file,rb)=NULL) 打开用户文件信息管理模块 fclose(fp); coutfilename); 删除文件 fclose(fp); return true; void ClearUserMes()删除用户全部信息 char name50; 定义数组name50 str
23、cpy(name,curuser-username); 拷贝用户名到数组 strcat(name,.exe); 扩展名.exe remove(name); 从磁盘中删除用户文件信息管理模块 ByeFile(false); 更新系统的用户登陆信息管理模块void DeleteUser()删除用户注册目录的操作 int SELETE; 定义SELETE char ch; 定义ch coutn该操作将会是你在系统所有信息删除,下次登陆时你必须重新申请用户名!endl; coutn你确定要删除你在系统中的注册信息吗?YNch; 输入选择 switch(ch) 提示用户确认删除 case Y: case
24、 y: if(ClearUserFile() 如果用户的全部文件已经删除了 则可以将该用户的文件信息管理模块也从磁盘中删除 以免在没完全删除文件却删了该文件信息管理模块 使得这些文件无法再进行管理造成磁盘空间的浪费 ClearUserMes(); 删除文件信息管理模块 break; default: coutfilepoint=true; 用户目录下的文件指针置真 if(fp=fopen(buffer,r)=NULL) 如果没有跟用户输入文件名相同的文件 if(fp=fopen(buffer,w)=NULL) 判断文件是否为空 coutn创建文件失败!; 显示 fclose(fp); return; fclose(fp); 关闭文件 else
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1