《2022年操作系统二级文件管理课程设计》由会员分享,可在线阅读,更多相关《2022年操作系统二级文件管理课程设计(13页珍藏版)》请在金锄头文库上搜索。
1、操作系统二级文件管理课程设计课程设计名称:二级文件管理系统专 业 班 级 : 软件工程计 083-1 学 生 姓 名 : 李晓斌学号 : 20082553103 指 导 教 师 : 任满杰精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 13 页设计目的: 通过具体的文件存储空间的管理、文件的物理结构、 目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。设计内容:为Linux 系统设计一个简单二级文件管理系统一、实验内容描述1 实验目标本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 .
2、 2 实验要求为 linux 系统设计一个简单的二级文件系统.要求做到以下几点:可以实现下列命令:login 用户登录dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件列目录时要列出文件名、物理地址、保护码和文件长度. 源文件可以进行读写保护. 程序设计(1) 设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。 另外,为了简便文件系统未考虑文件共享,文件系统安全以及管理文件与设备文件等特殊内容。(2) 主要数据结构A 磁盘块结构体:typedef struct distTa
3、ble int maxlength; int start; int useFlag; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 13 页 distTable *next; diskNode; diskNode *diskHead; B 文件块结构体:struct fileTable /文件块结构体 char fileName10; int strat; /文件在磁盘存储空间的起始地址 int length; /文件内容长度 int maxlength; /文件的最大长度 char fileKind3; /文件的属性读写方式 str
4、uct tm *timeinfo; bool openFlag; /判断是否有进程打开了该文件 /fileTable *next; ; C 两级目录结构体typedef struct user_file_directory /用户文件目录文件UFD /char fileName10; fileTable *file; user_file_directory *next; UFD; /UFD *headFile; typedef struct master_file_directory /主文件目录 MFD char userName10; char password10; UFD *user;
5、 MFD; (3)函数如下;void userCreate() char c; char userName10; int i; if(usedMaxUser) printf(请输入用户名: ); for(i=0;c=getch();i+) if(c=13) break; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 13 页 else userNamei=c; printf(%c,c); userNamei=0; for(i=0;iused;i+) if(!strcmp(userTablei.userName,userName) pr
6、intf(n); printf(该用户名已存在 , 创建用户失败 n); system(pause); return; strcpy(userTableused.userName,userName); printf(n); printf(请输入密码: ); for(i=0;c=getch();i+) if(c=13) break; else userTableused.passwordi=c; printf(*); userTableuserID.passwordi=0; printf(n); printf(创建用户成功 n); used+; system(pause); else print
7、f(创建用户失败,用户已达到上限n); system(pause); fflush(stdin); /清除文件缓冲区 int login() char name10,psw10; char c; int i,times; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 13 页 printf(请输入用户名 :); for(i=0;c=getch();i+) if(c=13) break; else namei=c; printf(%c,c); namei=0; for(i=0;iused;i+) if(!strcmp(userTable
8、i.userName,name) break; if(i=used) printf(n您输入的用户名不存在 n); system(pause); return -1; for(times=0;times3;times+) memset(psw,0,sizeof(psw); /将 psw 数组内的内容设置为空 printf(n请输入密码 :); for(i=0;c=getch();i+) if(c=13) break; else pswi=c; printf(*); printf(n); for(i=0;iuseFlag=0&p-maxlengthmaxLength) startPostion=
9、p-start; q=(diskNode *)malloc(sizeof(diskNode); q-start=p-start; q-maxlength=maxLength; q-useFlag=1; q-next=NULL; diskHead-start=p-start+maxLength; diskHead-maxlength=p-maxlength-maxLength; flag=1; temp=p; if(diskHead-next=NULL) diskHead-next=q; else while(temp-next) temp=temp-next; temp-next=q; bre
10、ak; p=p-next; return flag; void fileCreate(char fileName,int length,char fileKind) / 创建文件 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 13 页 /int i,j; time_t rawtime; int startPos; UFD *fileNode,*p; for(p=userTableuserID.user-next;p!=NULL;p=p-next) if(!strcmp(p-file-fileName,fileName) printf(
11、文件重名,创建文件失败 n); system(pause); return; if(requestDist(startPos,length) fileNode=(UFD *)malloc(sizeof(UFD); fileNode-file=(fileTable *)malloc(sizeof(fileTable); / 这一步必不可少,因为fileNode里面的指针也需要申请地址,否则fileNode-file指向会出错 strcpy(fileNode-file-fileName,fileName); strcpy(fileNode-file-fileKind,fileKind); file
12、Node-file-maxlength=length; fileNode-file-strat=startPos; fileNode-file-openFlag=false; time(&rawtime); fileNode-file-timeinfo=localtime(&rawtime); fileNode-next=NULL; if(userTableuserID.user-next=NULL) userTableuserID.user-next=fileNode; else p=userTableuserID.user-next; while(p-next) p=p-next; p-n
13、ext=fileNode; printf(创建文件成功 n); system(pause); else printf(磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败 n); system(pause); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 13 页 void freeDisk(int startPostion) diskNode *p; for(p=diskHead;p!=NULL;p=p-next) if(p-start=startPostion) break; p-useFlag=false; void fi
14、leDel(char fileName) UFD *p,*q,*temp; q=userTableuserID.user; p=q-next; while(p) if(!strcmp(p-file-fileName,fileName) break; else p=p-next; q=q-next; if(p) if(p-file-openFlag!=true) /先判断是否有进程打开该文件 temp=p; q-next=p-next; freeDisk(temp-file-strat); /磁盘空间回收 free(temp); printf(文件删除成功 n); system(pause);
15、else printf(该文件已被进程打开 , 删除失败 n); system(pause); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 13 页 else printf(没有找到该文件 , 请检查输入的文件名是否正确n); system(pause); void fileCat(char fileName) /查看文件内容 int startPos,length; int k=0; UFD *p,*q; q=userTableuserID.user; for(p=q-next;p!=NULL;p=p-next) if(!strc
16、mp(p-file-fileName,fileName) break; if(p) startPos=p-file-strat; length=p-file-length; p-file-openFlag=true; /文件打开标记n); for(int i=startPos;kfile-fileName); system(pause); else printf(没有找到该文件 , 请检查输入的文件名是否正确n); system(pause); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 13 页 void fileWrite(ch
17、ar fileName) /写入 UFD *p,*q; q=userTableuserID.user; int i,k,startPos; for(p=q-next;p!=NULL;p=p-next) if(!strcmp(p-file-fileName,fileName) break; if(p) if(!strcmp(p-file-fileKind,r) /判断文件类型是否允许写入 printf(该文件是只读文件 , 写入失败 n); system(pause); return; char str500; printf(please input content:n); gets(str);
18、 startPos=p-file-strat; p-file-openFlag=true; /文件打开标记 p-file-length=strlen(str); if(p-file-lengthp-file-maxlength) printf(写入字符串长度大于该文件的总长度, 写入失败n); system(pause); return; for(i=startPos,k=0;k(int)strlen(str);i+,k+) diski=strk; printf(文件写入成功 , 请用 close 命令将该文件关闭 n); system(pause); else printf(没有找到该文件
19、, 请检查输入的文件名是否正确n); system(pause); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 13 页 void fileDir(char userName) /显示某一用户的所有文件 UFD *p; int i,k; for(i=0;inext; printf(*n); printf(文件名文件长度文件在磁盘的起始地址文件类型创建时间 n); for(;p!=NULL;p=p-next) printf(%s %d %d %s %s,p-file-fileName, p-file-maxlength,p-file
20、-strat,p-file-fileKind,asctime(p-file-timeinfo); printf(*n); system(pause); void diskShow() /文件在磁盘上的属性精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 13 页 diskNode *p; int i=0,unusedDisk=0; printf(*n); printf( 盘块号起始地址容量 (bit) 是否已被使用n); for(p=diskHead;p!=NULL;p=p-next,i+) if(p-useFlag=false) un
21、usedDisk+=p-maxlength; printf( %d %d %d %d n,i,p-start,p-maxlength,p-useFlag); printf(*n); printf(磁盘空间总容量:512*1024bit 已使用: %dbit 末使用:%dbitnn,MaxDisk-unusedDisk, unusedDisk); system(pause); void fileClose(char fileName) /文件关闭 UFD *p,*q; q=userTableuserID.user; for(p=q-next;p!=NULL;p=p-next) if(!strcm
22、p(p-file-fileName,fileName) break; if(p) p-file-openFlag=false; printf(%s文件已关闭 n,p-file-fileName); system(pause); else printf(没有找到该文件 , 请检查输入的文件名是否正确n); system(pause); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 13 页心得体会在设计程序之前, 我先花费了一天多的时间思考设计该程序的思路,熟悉了一下学过的课本, 把以前忘了的东西又熟悉了一下,然后就通过操作系统要求开
23、始设计程序了, 我采用了一个模块一测试, 成功之后在写另一个模块, 刚开始创建文件,显示你创建成功了, 可是却在指定路径中没有该文件,只有一个二级文件目录,经过我认真的查看, 发现我用的函数是创建目录的, 而非创建文件。 随后我就选择了给他指定一个二级文件目录,在该目录中创建文件, 终于测试成功了,接着我有创建了删除文件函数, 打开文件函数, 关闭文件函数, 如文件函数,写文件函数,虽然也遇到了好多问题,我通过测试,查资料,细心的修改和调试后,最后还是一个模块一个模块的成功完成了,但是没法实现读写保护, 而且整体测试时也出现了一些逻辑问题,例如:对于创建的只读文件,只写文件,可读可写文件均可以
24、进行读写, 这不符合逻辑, 经过我的认真思考后, 我把程序修改了一下,实现了在读,写文件前,先打开文件,而且对于只读文件,只能读取,不能写入,对于只写文件, 只能写入不能读取, 对于可读可写文件, 既可以读取,又可以写入等功能。对于读写保护,我试着用打开文件来控制,当读文件时,可以显示打开的文件列表, 该文件列表中只有只读文件和可读可写文件,当你从只写文件读取时,提示你这是只写文件,不能读取。同理,在写文件时,显示的打开的文件列表中只有只写文件和可读可写文件,当你对只读文件写入内容时, 提示你这是只读文件,不能写入。这样实现了文件的读写保护。虽然本次课程设计的所做的程序规模不是很大,但在编程中
25、我也充分体味到作为一名程序员, 要有严密的逻辑思维能力的重要性,充分学好一些逻辑学科的重要性;一个没有逻辑的程序,就不能完美地实现所要完成的功能,因此,以后学习中一定会注重培养自己的逻辑思维能力,为自己成为一个高级软件工程师做好铺垫。通过这一个星期的课程设计,加深了对于操作系统这门课程的兴趣以及深入理解,培养了耐心、认真、永不放弃等优良品质。通过这次课程设计使我相信只要做,就能做到,增强了我的自信心。 当然我也深深地感到了自己对某些知识的认识不足与缺陷,今后我将通过多看书及多编程序等实际手段入手,希望自己的编程能力能得到一定的提高。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 13 页