实验6:文件系统

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验6:文件系统要求:1、设计一个有m个用户的文件系统,每个用户最多可保存一个文件。2、规定用户在一次运行中只能打开K个文件。3、系统能检查键入命令的正确性,出错时应能显示出错原因。4、对文件应能设置保护措施,如只能执行、允许读、允许写等。5、对文件的操作设计提供一套文件操作:CREATE建立文件;DELETE删除文件;OPEN打开文件;CLOSE关闭文件;READ读文件;WRITE写文件。6、文件系统采用二级文件目录结构,第一级为文件目录MFD,第二级为用户文件目录UFD,如下表所示:主文件目录用户名用户文件目录地址用户文件目录文件名状态(打开/建立)指针提示:可采用以为数组模拟位示图来表示存储空间的分配情况。源程序代码:#if!defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)#defineAFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_#if_MSC_VER1000#pragmaonce#endif//_MSC_VER1000externintdisk_block[10000];externintdisk_empty;typedefstructUFD//存储文件信息{charname[10];intattribute;//文件属性intlength;inta[10];int*p1;//一级索引int(*p2)[100];//二级索引structUFD*next;//指向文件链表中此文件结点的下一个结点}UFD;typedefstructDIR//存储目录信息{DIR*above;//指向目录链表中此目录结点的上一个结点charname[10];intlength;DIR*next;//指向目录链表中引目录结点的下一个结点UFD*File_head;//此目录下文件链表的头指针DIR*Dir_head;//此目录下目录链表的头指针}DIR;classCuse//定义管理用户目录的类{DIR*now;//当前目录UFD*Fhead;//文件链表的头结点DIR*Dhead;//目录链表的头结点charcode[10];//用户密码charname[10];//用户名称intlength;//用户所使用空间大小intstatus;//此对象是否已经分配给用户public:voidset_status(int);intdele_user();intdis_file();//显示文件所占外存块号intdis_dir(DIR*d);//实现显示当前路径的函数intget_length();charconst*get_name();charconst*get_code();intget_status();intset_user(char*,char*);//设置用户名与密码DIR*get_now();intdele_file(UFD*f);//删除文件的具体实现部分intdele_dir(DIR*);//删除目录的具体实现部分Cuse();~Cuse();intgoback();//返回上一级目录intdis_now();//显示当前目录的信息intnew_file();intnew_dir();intopen_dir();intopen_file();intfirst_dele_file();//实现删除文件的前部分工作intfirst_dele_dir();//实现删除目录的前部分工作intset_code();};classCdisk{public:Cuseuser[5];charcode[10];intdis_disk();intfirst_dele_user();intdele_user(int);intnew_user();//查看当前用户信息与外存空间使用情况intset_code();intlogin();//用户登录Cdisk();virtual~Cdisk();};#endif//!defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)#includestring.h#includeiostream.h#includeiomanip.hintdisk_block[10000];intdisk_empty;Cdisk::Cdisk(){inti=0;charcode[10]=123456;for(i=0;i10000;i++)disk_block[i]=0;this-user[0].set_user(student,123);disk_empty=10000;cout.setf(ios::left);}Cdisk::~Cdisk(){}intCdisk::dele_user(inti){CuseC;C=user[i];user[i].dele_user();return1;}intCdisk::dis_disk(){inti=0;coutsetw(14)用户名setw(14)占用空间大小endl;for(i=0;i5;i++)if(user[i].get_status()==1)coutsetw(14)user[i].get_name()setw(14)user[i].get_length()endl;cout已用空间:10000-disk_emptyendl剩余空间:disk_emptyendl;return1;}intCdisk::login(){charn[10],c[10];inti;cout请输入用户名与密码,中间用空格隔开endl;cinnc;for(i=0;i5;i++){if(user[i].get_status())if(!strcmp(n,user[i].get_name()))if(!strcmp(c,user[i].get_code())){cout登录成功endl;cout欢迎user[i].get_name()登录endl;returni;}else{cout密码错误endl;return-1;}}cout没有这个用户endl;return-1;}intCdisk::set_code(){chartemp1[10],temp2[10];cout请输入原密码endl;cintemp1;if(strcmp(temp1,code)){cout原密码错误endl;return0;}while(1){cout请输入请新密码endl;cintemp1;cout请再输入新密码endl;cintemp2;if(strcmp(temp1,temp2)){cout两次输入不一致endl;break;}cout密码设置成功endl;strcpy(code,temp1);}return1;}intCdisk::new_user(){charn[10],c[10];inti=0;for(i=0;i5;i++)if(user[i].get_status()==0)break;if(i==5){cout已经达到最大用户个数,不能创建endl;return0;}user[i].set_status(1);cout请输入用户名称endl;cinn;cout请输入密码endl;cinc;user[i].set_user(n,c);cout用户创建成功endl;return1;}intCdisk::first_dele_user(){charn[10],c;inti;cout请输入你要删除的用户的名称endl;cinn;for(i=0;i5;i++)if(!strcmp(user[i].get_name(),n)&&user[i].get_status())break;if(i==5){cout此用户不存在endl;return0;}cout确认删除此用户?确认请按Y,取消请按其他键endl;cinc;if(c!='Y'){cout已经取消删除endl;return0;}this-dele_user(i);cout用户删除成功endl;return1;}Cuse::Cuse(){status=0;length=0;now=0;Fhead=0;Dhead=0;}Cuse::~Cuse(){disk_empty+=length;length=0;UFD*f=Fhead;DIR*d=Dhead;while(f!=0){if(f-next==0){this-dele_file(f);f=0;break;}while(f-next-next!=0)f=f-next;this-dele_file(f-next);f-next=0;f=Fhead;}while(d!=0){if(d-next==0){this-dele_dir(d);d=0;break;}while(d-next-next!=0)d=d-next;this-dele_dir(d-next);d-next=0;d=Dhead;}}intCuse::new_file(){inti=0,j=0;UFD*p=0;p=newUFD;//开辟一个新的文件结构体if(p==0)//如果p已经指向空了,说明没有空间了{cout无可用内存空间,创建文件失败endl;return1;}cout请输入建立的文件的名称,长度,属性(0:只读,1:读写)endl;cinp-namep-lengthp-attribute;//初始化一些文件的参数if(p-lengthdisk_empty)//如果我们需要的文件长度大于当前系统尚存的空间,则无法创建{cout作业太大,当前硬盘可用空间为:disk_emptyendl;deletep;return0;}for(i=0;ip-length&&i10;i++)//如果满足要求,并且i小于10个结点那么开始分配for(j;j10000;j++)if(disk_block[j]==0){p-a[i]=j;disk_block[j]=1;//分配后将此块设置为1,表示已经被使用j++;break;}p-p1=0;p-p2=0;if(p-length10)//一级索引的实现//长度大于10{p-p1=newint[100];for(i=10;ip-length&&i110;i++)for(j;j10000;j++)/*为当前的这个文件分配空间,使用位示图法*/if(disk_block[j]==0){(p-p1)[i-10]=j;disk_block[j]=1;j++;break;}if(p-length110)//文件长度大于110,使用二级索引实现{p-p2=newint[100][100];for(i=110;ip-length;i++)for(j;j10000;j++)/*采用位示图法分配空间*/if(disk_block[j]==0){intm=(i-110)/100;//得到行号intk=(i-110)%100;//得到列号p-p2[m][k]=j;disk_block[j]=1;j++;break;}}}return0;}intCuse::new_dir(){DIR*p,*h;cout请输入新目录的名字endl;p=newDIR;//p指向这个新建的目录DIR(新的结构体)cinp-name;//输入目录的名字/*初始化这个目录的属性*/p-Dir_head=0;p-l

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功