收藏 分销(赏)

操作系统二级文件管理课程设计.doc

上传人:a199****6536 文档编号:10523857 上传时间:2025-06-01 格式:DOC 页数:13 大小:80KB
下载 相关 举报
操作系统二级文件管理课程设计.doc_第1页
第1页 / 共13页
操作系统二级文件管理课程设计.doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述
操作系统二级文件管理课程设计 课程设计名称: 二级文件管理系统 专 业 班 级 : 软件工程计083-1 学 生 姓 名 : 李晓斌 学 号 : 20082553103 指 导 教 师 : 任满杰 设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 设计内容:为Linux系统设计一个简单二级文件管理系统 一、实验内容描述 1 实验目标 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现. 2 实验要求 为linux系统设计一个简单的二级文件系统.要求做到以下几点: ①可以实现下列命令: login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 ②列目录时要列出文件名、物理地址、保护码和文件长度. ③源文件可以进行读写保护. 程序设计 (1) 设计思想 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管理文件与设备文件等特殊内容。 (2) 主要数据结构 A 磁盘块结构体: typedef struct distTable { int maxlength; int start; int useFlag; distTable *next; }diskNode; diskNode *diskHead; B 文件块结构体: struct fileTable //文件块结构体 { char fileName[10]; int strat; //文件在磁盘存储空间的起始地址 int length; //文件内容长度 int maxlength; //文件的最大长度 char fileKind[3]; //文件的属性——读写方式 struct tm *timeinfo; bool openFlag; //判断是否有进程打开了该文件 //fileTable *next; }; C 两级目录结构体 typedef struct user_file_directory //用户文件目录文件UFD { //char fileName[10]; fileTable *file; user_file_directory *next; }UFD; //UFD *headFile; typedef struct master_file_directory //主文件目录MFD { char userName[10]; char password[10]; UFD *user; }MFD; (3)函数如下; void userCreate() { char c; char userName[10]; int i; if(used<MaxUser) { printf("请输入用户名:"); for(i=0;c=getch();i++) { if(c==13) break; else userName[i]=c; printf("%c",c); } userName[i]='\0'; for(i=0;i<used;i++) { if(!strcmp(userTable[i].userName,userName)) { printf("\n"); printf("该用户名已存在,创建用户失败\n"); system("pause"); return; } } strcpy(userTable[used].userName,userName); printf("\n"); printf("请输入密码:"); for(i=0;c=getch();i++) { if(c==13) break; else userTable[used].password[i]=c; printf("*"); } userTable[userID].password[i]='\0'; printf("\n"); printf("创建用户成功\n"); used++; system("pause"); } else { printf("创建用户失败,用户已达到上限\n"); system("pause"); } fflush(stdin); //清除文件缓冲区 } int login() { char name[10],psw[10]; char c; int i,times; printf("请输入用户名:"); for(i=0;c=getch();i++) { if(c==13) break; else name[i]=c; printf("%c",c); } name[i]='\0'; for(i=0;i<used;i++) { if(!strcmp(userTable[i].userName,name)) break; } if(i==used) { printf("\n您输入的用户名不存在\n"); system("pause"); return -1; } for(times=0;times<3;times++) { memset(psw,'\0',sizeof(psw)); //将psw数组内的内容设置为空 printf("\n请输入密码:"); for(i=0;c=getch();i++) { if(c==13) break; else psw[i]=c; printf("*"); } printf("\n"); for(i=0;i<used;i++) { if(!strcmp(psw,userTable[i].password)) { printf("用户登录成功\n"); system("pause"); break; } } if(i==used) { printf("您输入的密码错误,您还有%d次输入机会\n",2-times); if(times==2) exit(0); } else break; } fflush(stdin); return i; } int requestDist(int &startPostion,int maxLength) { int flag=0; //标记是否分配成功 diskNode *p,*q,*temp; p=diskHead; while(p) { if(p->useFlag==0&&p->maxlength>maxLength) { startPostion=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; } break; } p=p->next; } return flag; } void fileCreate(char fileName[],int length,char fileKind[]) //创建文件 { //int i,j; time_t rawtime; int startPos; UFD *fileNode,*p; for(p=userTable[userID].user->next;p!=NULL;p=p->next) { if(!strcmp(p->file->fileName,fileName)) { printf("文件重名,创建文件失败\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); fileNode->file->maxlength=length; fileNode->file->strat=startPos; fileNode->file->openFlag=false; time(&rawtime); fileNode->file->timeinfo=localtime(&rawtime); fileNode->next=NULL; if(userTable[userID].user->next==NULL) userTable[userID].user->next=fileNode; else { p=userTable[userID].user->next; while(p->next) p=p->next; p->next=fileNode; } printf("创建文件成功\n"); system("pause"); } else { printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n"); system("pause"); } } void freeDisk(int startPostion) { diskNode *p; for(p=diskHead;p!=NULL;p=p->next) { if(p->start==startPostion) break; } p->useFlag=false; } void fileDel(char fileName[]) { UFD *p,*q,*temp; q=userTable[userID].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"); } else { printf("该文件已被进程打开,删除失败\n"); system("pause"); } } else { printf("没有找到该文件,请检查输入的文件名是否正确\n"); system("pause"); } } void fileCat(char fileName[]) //查看文件内容 { int startPos,length; int k=0; UFD *p,*q; q=userTable[userID].user; for(p=q->next;p!=NULL;p=p->next) { if(!strcmp(p->file->fileName,fileName)) break; } if(p) { startPos=p->file->strat; length=p->file->length; p->file->openFlag=true; //文件打开标记 printf("*****************************************************\n"); for(int i=startPos;k<length;i++,k++) { if(i%50==0) printf("\n"); //一行大于50个字符换行 printf("%c",disk[i]); } printf("\n\n*****************************************************\n"); printf("%s已被read进程打开,请用close命令将其关闭\n",p->file->fileName); system("pause"); } else { printf("没有找到该文件,请检查输入的文件名是否正确\n"); system("pause"); } } void fileWrite(char fileName[]) //写入 { UFD *p,*q; q=userTable[userID].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 str[500]; printf("please input content:\n"); gets(str); startPos=p->file->strat; p->file->openFlag=true; //文件打开标记 p->file->length=strlen(str); if(p->file->length>p->file->maxlength) { printf("写入字符串长度大于该文件的总长度,写入失败\n"); system("pause"); return; } for(i=startPos,k=0;k<(int)strlen(str);i++,k++) disk[i]=str[k]; printf("文件写入成功,请用close命令将该文件关闭\n"); system("pause"); } else { printf("没有找到该文件,请检查输入的文件名是否正确\n"); system("pause"); } } void fileDir(char userName[]) //显示某一用户的所有文件 { UFD *p; int i,k; for(i=0;i<MaxUser;i++) { if(!strcmp(userTable[i].userName,userName)) { k=i;break; } } if(i==MaxUser) { printf("没有找到该用户,请检查输入用户名是否正确\n"); system("pause"); return; } else { p=userTable[k].user->next; printf("********************************************************************************\n"); printf("文件名 文件长度 文件在磁盘的起始地址 文件类型 创建时间\n"); for(;p!=NULL;p=p->next) printf("%s %d %d %s %s",p->file->fileName, p->file->maxlength,p->file->strat,p->file->fileKind,asctime(p->file->timeinfo)); printf("********************************************************************************\n"); system("pause"); } } void diskShow() //文件在磁盘上的属性 { 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) unusedDisk+=p->maxlength; printf(" %d %d %d %d \n",i,p->start,p->maxlength,p->useFlag); } printf("***************************************************************************\n"); printf("磁盘空间总容量:512*1024bit 已使用:%dbit 末使用:%dbit\n\n",MaxDisk-unusedDisk, unusedDisk); system("pause"); } void fileClose(char fileName[]) //文件关闭 { UFD *p,*q; q=userTable[userID].user; for(p=q->next;p!=NULL;p=p->next) { if(!strcmp(p->file->fileName,fileName)) break; } if(p) { p->file->openFlag=false; printf("%s文件已关闭\n",p->file->fileName); system("pause"); } else { printf("没有找到该文件,请检查输入的文件名是否正确\n"); system("pause"); } } 心得体会 在设计程序之前,我先花费了一天多的时间思考设计该程序的思路,熟悉了一下学过的课本,把以前忘了的东西又熟悉了一下,然后就通过操作系统要求开始设计程序了,我采用了一个模块一测试,成功之后在写另一个模块,刚开始创建文件,显示你创建成功了,可是却在指定路径中没有该文件,只有一个二级文件目录,经过我认真的查看,发现我用的函数是创建目录的,而非创建文件。 随后我就选择了给他指定一个二级文件目录,在该目录中创建文件,终于测试成功了,接着我有创建了删除文件函数,打开文件函数,关闭文件函数,如文件函数,写文件函数,虽然也遇到了好多问题,我通过测试,查资料,细心的修改和调试后,最后还是一个模块一个模块的成功完成了,但是没法实现读写保护,而且整体测试时也出现了一些逻辑问题,例如:对于创建的只读文件,只写文件,可读可写文件均可以进行读写,这不符合逻辑,经过我的认真思考后,我把程序修改了一下,实现了在读,写文件前,先打开文件,而且对于只读文件,只能读取,不能写入,对于只写文件,只能写入不能读取,对于可读可写文件,既可以读取,又可以写入等功能。对于读写保护,我试着用打开文件来控制,当读文件时,可以显示打开的文件列表,该文件列表中只有只读文件和可读可写文件,当你从只写文件读取时,提示你这是只写文件,不能读取。同理,在写文件时,显示的打开的文件列表中只有只写文件和可读可写文件,当你对只读文件写入内容时,提示你这是只读文件,不能写入。这样实现了文件的读写保护。 虽然本次课程设计的所做的程序规模不是很大,但在编程中我也充分体味到作为一名程序员,要有严密的逻辑思维能力的重要性,充分学好一些逻辑学科的重要性;一个没有逻辑的程序,就不能完美地实现所要完成的功能, 因此,以后学习中一定会注重培养自己的逻辑思维能力,为自己成为一个高级软件工程师做好铺垫。 通过这一个星期的课程设计,加深了对于操作系统这门课程的兴趣以及深入理解,培养了耐心、认真、永不放弃等优良品质。通过这次课程设计使我相信只要做,就能做到,增强了我的自信心。当然我也深深地感到了自己对某些知识的认识不足与缺陷,今后我将通过多看书及多编程序等实际手段入手,希望自己的编程能力能得到一定的提高。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服