当前位置:文档之家› 模拟磁盘文件管理系统.

模拟磁盘文件管理系统.

模拟磁盘文件管理系统一、任务描述模拟实现一个文件管理系统开发语言:C++、C语言、java开发工具:自选要求1、可以实现一下命令(以下命令至少实现5条):●login 用户登录●dir 列文件目录●create 创建文件●delete 删除文件●open 打开文件●close 关闭文件●cd 改变目录●mkdir 创建目录●rddir 删除目录●halt 退出系统2、列目录要求列出文件名、物理地址、文件大小、读写标识二、任务完成情况⑴自定义磁盘文件管理的数据结构;⑵能够自由创建、修改、删除文件;⑶文件具有一定自定义的属性;⑷能够显示当前系统文件的状态;(5)能够完成任务后退出系统。

三、系统流程图与函数调用关系1、类和主要函数程序中定义了两个类:(1)class file //文件类主要功能是对文件属性的定义,文件在虚拟磁盘地址块的定位。

(2)class fdatabase //文件操作类主要功能是对创建、删除、修改等方法的具体实现。

程序中的主要函数及说明:char *getname( ) //获取文件名int gettag( ) //获取删除标记int getlength() //获取文件大小int getblocknum() // 磁盘块数int getblocksum1() //磁盘块号的始点int getblocksum2() //磁盘块号的终点void setname(char na[ ] )//设置文件名void delwenjian(){ tag=1; } //设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建文件void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件void disp( ) //输出文件信息int search(char *fname) //按文件名查找int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在int deltefile(char *na) //删除文件时先查找是否存在2、函数流程图(1)整体流程图(2)创建文件流程图3、删除文件流程图4、输出文件流程图四、系统使用说明与界面设计(1)、课程设计的模板说明1、初始化,建立文件系统输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。

2、循环选择执行以下功能1、存储文件输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数为其分配足够多的磁盘块,并记录下来输出所占用的磁盘块号2、删除文件输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块删除该文件名3、显示位示图情况显示位示图的情况显示剩余磁盘块的数目4、显示文件列表显示文件名,文件大小,占用的磁盘块数目和磁盘块号这样,初始化,建立文件系统完成。

运行结果:(3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式(行列皆从0开始编号);2、选择执行:存储文件,删除文件,显示位示图情况,显示文件列表显示文件系统管理列表,并提示输入信息1——4。

用户输入文件操作命令1(存储文件),2 (删除文件)、3(显示位示图情况)、4(显示文件列表);格式如下:键入1,创建文件名为fname,大小为L(MB)的文件;键入2,删除文件名为fname的文件;键入3,显示位示图情况;键入4,显示所有文件信息。

运行结果:(2)、存储文件建立文件名为jike大小为200(MB)的文件:再建立文件名为wo大小为20(MB)的文件后显示文件列表:显示位示图情况:(3)、删除文件输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块,删除该文件名文件名不存在时:成功删除jike文件:显示删除后剩余磁盘块的数目:(4)、退出系统五、结论与体会在本次课程设计刚刚开始时,不知道怎么设计。

后来认真阅读课本有关的知识,知道怎样设计才方便文件操作。

知道怎样设计后,写程序时也遇到很多的障碍,特别是出错处理。

此时深感自己编程能力的不足,经过多次修改,终于设计好了该设计。

自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识与掌握。

通过该课程设计,使我们更了解了课本知识,巩固了课本知识,同时也使我们的编程能力有了一定的提高,我认实到学好计算机要重视实践操作,不仅仅是学习c++语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

六、附录出现源代码#include<iostream.h>#include <math.h>#include<iomanip.h>#include<string.h>#include<fstream.h>#include <stdio.h>#include <stdlib.h>int i=0,j=0,sum=0,tt=0,r,ii,k,g,m;int a[100][32];class file//文件类{private:int no; //文件编号char name[10]; //文件名public:int tag; //删除标记 1:已删 0:未删file( ){ }char *getname( ){return name;} //获取姓名int gettag( ){return tag;} //获取删除标记int getno() {return no;} //获取文件编号int getlength() {return length;} //获取文件大小int getblocknum() {return blocknum;} // 磁盘块数int getblocksum1()//磁盘块号的始点{ return blocksum1; }int getblocksum2()//磁盘块号的终点{ return blocksum2;}int length; //文件大小int blocknum;//盘块数int blocksum1;//所占盘块号的始点int blocksum2;//所占盘块号的终点void setname(char na[ ] ) //设置文件名{strcpy(name,na);}void delwenjian(){ tag=1; }//设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建文件 { tag=0;length=L;blocknum=num;blocksum1=s1;blocksum2=s2;strcpy(name,na);blocknum=length/m; //盘块数=文件大小/盘块大小if(length%m!=0) //盘块数取上整blocknum=blocknum+1;cout<<" 所需磁盘块数:"<<blocknum<<endl<<endl;if((sum+blocknum)<=32) //所有盘块数只占用一行,直接赋值{ for(;j<(sum+blocknum);j++)a[i][j]=1;sum=sum+blocknum; //再进行下面文件的盘块数累加}else{ //占用多行,先赋值整行for(;j<32;j++)a[i][j]=1;i=i+1;for(j=0;j<(sum+blocknum)-32;j++) //再进行剩余项赋值{a[i][j]=1;}sum=sum+blocknum-32;}tt=tt+blocknum; //输出文件所占用的盘块号cout<<" 所占磁盘块号:"<<tt-blocknum<<" to "<<tt-1<<endl;blocksum1=tt-blocknum;blocksum2=tt-1;}void deltefile(char *na) //删除文件{ tag=1;strcpy(name,na);}void disp( )//输出文件信息{cout<<setw(8)<<name<<setw(10)<<length<<setw(18)<<blocknum<<setw(12)<<blocksum1<<" to "<<blocksum2<<endl;}};class fdatabase //文件库类{ private:int top; //文件记录指针file f[50];public:fdatabase() //构造函数{top=-1;}int search(char *fname)//按文件名查找{for ( ii=0;ii<=top;ii++){ if (strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0)return 0;}return 1;}int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在{ int p;p=search(na);if (p==1){ top++;f[top].creatfile(na,L,num,s1,s2);return 1;}else{cout<<" 该文件已存在,不能创建\n\n";return 0; }}int deltefile(char *na)//删除文件时先查找是否存在{int b,p,x=0,n1,n2,q1,q2,t;p=search(na);if (p==0) //若文件存在{ //进行删除文件赋值f[ii].tag=1;b=f[ii].length/m; //盘块数=当前文件大小/盘块大小if(ii==0) // 对第一个删除文件进行赋值for(k=0;k<b;k++)a[x][k]=0;else{n1=(f[ii-1].blocksum2+1)/32; //被查找的文件之前文件所占用的盘块数/32, //大于0表示跨行n2=(f[ii].blocksum2+1)/32; //所有文件所占用的盘块数/32,大于0表示跨行q1=(f[ii-1].blocksum2+1)-n1*32; // 当前文件的开始盘块号q2=(f[ii].blocksum2+1)-n2*32; // 用于跨行后计算盘块号t=n2-n1;if(t==0) //若n2与n1相等,表明当前所有被占用盘块在同一行for(k=q1;k<1+b;k++)a[n2][k]=0;else{ if((f[ii-1].blocksum2+1)%32==0) //前面所占用的盘块数是32倍数{ x=x+n1; //当前文件赋值for(;t-1>=0;t--,x++) //循环进行整行赋值for(k=0;k<32;k++)a[x][k]=0;x=n2; //对剩余项赋值for(k=0;k<b-(t-1)*32;k++)a[x][k]=0;}else //对当前文件前几项赋值{ x=n1;for(k=q1;k<32;k++)a[x][k]=0;x=x+1;int t1=t;for(;t-1>0;t--,x++) //中间整行赋值for(k=0;k<32;k++)a[x][k]=0;x=n2; //最后剩余项赋值for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++)a[x][k]=0;}}return 1; }}else{cout<<"该文件不存在";return 0;}}void disp() //输出所有文件信息{for (int i=0;i<=top;i++)if(f[i].tag==0)f[i].disp();}};void bit_map(int I){int s=0;cout<<"---------------------------------------------------------------"<<endl;for(int p=0;p<I;p++){for(int q=0;q<32;q++)cout<<a[p][q]<<" ";cout<<endl;}cout<<"----------------------------------------------------------------"<<endl;for(int p1=0;p1<I;p1++)for(int q1=0;q1<32;q1++)if(a[p1][q1]==1)s=s+1;s=(g*1024)/m-s;cout<<" 剩余盘块数:"<<s<<endl;}void main(){ int I,l,b,i,j,ss1,ss2,sum=0;char fname[20];fdatabase p;file w;cout <<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 初始化,建立文件系统 *\n";cout <<"\t\t**\n";cout<<"\t\t************************************************\n";cout <<" 请输入磁盘大小GB: ";cin >>g;cout<<endl;cout <<" 请输入盘块大小MB: ";cin >>m;cout<<endl;I=(g*1024)/(32*m);for( i=0;i<I;i++)for( j=0;j<32;j++)a[i][j]=0;cout<<" 建立的位示图为:"<<endl;bit_map(I);cout<<" 行数:"<<I<<endl;cout <<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 行号、列号与磁盘块号的转换公式为: *\n"; cout <<"\t\t* 磁盘块号=行号*32+列号 *\n";cout <<"\t\t* 行号=磁盘块号/32 *\n";cout <<"\t\t* 列号=磁盘块号%32 *\n";cout <<"\t\t* *\n";cout <<"\t\t************************************************\n";char choice;while(choice!='0'){cout<<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 文件管理系统 *\n";cout <<"\t\t**\n";cout<<"\t\t************************************************\n";cout <<"\t\t\t1 存储文件\n\n\t\t\t2 删除文件\n\n\t\t\t3 显示位示图情况 \n\n\t\t\t4 显示文件列表 \n\n\t\t\t5退出系统"<<endl;cout <<" 请输入选择项: ";cin >> choice;cout<<endl;switch (choice){case '1':cout <<" 请输入文件名: ";cin>>fname;cout<<endl; //创建文件前,先查找是否有同名文件存在int q;q=p.search(fname);if (q==0){ cout<<" 该文件已存在,不能创建\n\n";break;}cout <<" 请输入文件大小MB: ";cin>>l;cout<<endl;if(l>g*1024){cout<<" 文件大小超过磁盘最大容量,无法进行分配"<<endl;break;}p.creatfile(fname,l,b,ss1,ss2);break;case '2':cout <<" 请输入文件名: ";cin>>fname;cout<<endl;q=p.search(fname);if (!q==0){cout<<" 该文件不存在,无法删除\n\n ";break;}p.deltefile(fname);break;case '3':cout <<"\t\t**************显示位示图如下*********************\n"; bit_map(I);cout<<endl;break;case '4':cout <<"\t\t*************文件列表如下************************\n";cout<<"---------------------------------------------------------------"<<endl;cout<<setw(10)<<"文件名"<<setw(15)<<"文件大小(MB)"<<setw(15)<<"所占盘块数"<<setw(15)<<"所占盘块号"<<endl;p.disp();cout<<endl;break;case '5':cout<<"\t\t成功退出系统";exit(0);break;default:cout<<"输入错误,请从新输入: \n\n";break;}}}。

相关主题