模拟磁盘文件管理的程序.docx
《模拟磁盘文件管理的程序.docx》由会员分享,可在线阅读,更多相关《模拟磁盘文件管理的程序.docx(19页珍藏版)》请在冰点文库上搜索。
![模拟磁盘文件管理的程序.docx](https://file1.bingdoc.com/fileroot1/2023-6/11/b854fc81-5753-4bd4-8f00-37227dfbac54/b854fc81-5753-4bd4-8f00-37227dfbac541.gif)
模拟磁盘文件管理的程序
模拟磁盘文件管理的程序
一、课程设计内容
⑴自定义磁盘文件管理的数据结构;
⑵能够自由创建、修改、删除文件;
⑶文件具有一定自定义的属性;
⑷能够显示当前系统文件的状态。
二、课程设计的数据结构说明
程序中定义了两个类:
classfile//文件类
{private:
charname[10];//文件名
public:
inttag;//删除标记1:
已删0:
未删
file(){}
char*getname(){returnname;}//获取文件名
intgettag(){returntag;}//获取删除标记
intgetlength(){returnlength;}//获取文件大小
intgetblocknum(){returnblocknum;}//磁盘块数
intgetblocksum1(){returnblocksum1;}//磁盘块号的始点
intgetblocksum2(){returnblocksum2;}//磁盘块号的终点
intlength,blocknum,blocksum1,blocksum2;
voidsetname(charna[]){strcpy(name,na);}//设置文件名
voiddelwenjian(){tag=1;}//设置删除标记1:
已删0:
未删
voidcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件
voiddeltefile(char*na){tag=1;strcpy(name,na);}//删除文件
voiddisp()//输出文件信息
classfdatabase//文件库类
{private:
inttop;//文件记录指针
filef[50];
public:
fdatabase(){top=-1;}//构造函数
intsearch(char*fname)//按文件名查找
intcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件时先查找是否存在
intdeltefile(char*na)//删除文件时先查找是否存在
voiddisp()//输出所有文件信息
};
三、课程设计的模板说明
1、初始化,建立文件系统
输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位
输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。
2、循环选择执行以下功能
1、存储文件
输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数
为其分配足够多的磁盘块,并记录下来
输出所占用的磁盘块号
2、删除文件
输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块
删除该文件名
3、显示位示图情况
显示位示图的情况
显示剩余磁盘块的数目
4、显示文件列表
显示文件名,文件大小,占用的磁盘块数目和磁盘块号
四、课程设计的源代码
#include
#include
#include
#include
#include
inti=0,j=0,sum=0,tt=0,r,ii,k,g,m;
inta[100][32];
classfile//文件类
{private:
intno;//文件编号
charname[10];//文件名
public:
inttag;//删除标记1:
已删0:
未删
file(){}
char*getname(){returnname;}//获取姓名
intgettag(){returntag;}//获取删除标记
intgetno(){returnno;}//获取文件编号
intgetlength(){returnlength;}//获取文件大小
intgetblocknum(){returnblocknum;}//磁盘块数
intgetblocksum1()//磁盘块号的始点
{returnblocksum1;}
intgetblocksum2()//磁盘块号的终点
{returnblocksum2;}
intlength;//文件大小
intblocknum;//盘块数
intblocksum1;//所占盘块号的始点
intblocksum2;//所占盘块号的终点
voidsetname(charna[])//设置文件名
{strcpy(name,na);}
voiddelwenjian(){tag=1;}//设置删除标记1:
已删0:
未删
voidcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件
{tag=0;
length=L;
blocknum=num;
blocksum1=s1;
blocksum2=s2;
strcpy(name,na);
blocknum=length/m;//盘块数=文件大小/盘块大小
if(length%m!
=0)//盘块数取上整
blocknum=blocknum+1;
cout<<"所需磁盘块数:
"<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<<"所占磁盘块号:
"<blocksum1=tt-blocknum;
blocksum2=tt-1;
}
voiddeltefile(char*na)//删除文件
{tag=1;
strcpy(name,na);
}
voiddisp()//输出文件信息
{cout<};
classfdatabase//文件库类
{private:
inttop;//文件记录指针
filef[50];
public:
fdatabase()//构造函数
{top=-1;}
intsearch(char*fname)//按文件名查找
{
for(ii=0;ii<=top;ii++)
{if(strcmp(f[ii].getname(),fname)==0&&f[ii].tag==0)
return0;
}
return1;
}
intcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件时先查找是否存在
{intp;
p=search(na);
if(p==1)
{top++;
f[top].creatfile(na,L,num,s1,s2);
return1;}
else
{cout<<"!
!
!
该文件已存在,不能创建!
!
!
\n\n";
return0;}
}
intdeltefile(char*na)//删除文件时先查找是否存在
{intb,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
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;ka[x][k]=0;
}
else//对当前文件前几项赋值
{x=n1;
for(k=q1;k<32;k++)
a[x][k]=0;
x=x+1;
intt1=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;
}
}
return1;}
}
else
{cout<<"该文件不存在";
return0;}
}
voiddisp()//输出所有文件信息
{
for(inti=0;i<=top;i++)
if(f[i].tag==0)
f[i].disp();
}
};
voidbit_map(intI)
{
ints=0;
cout<<"---------------------------------------------------------------"<for(intp=0;p
{for(intq=0;q<32;q++)
cout<cout<}
out<<"----------------------------------------------------------------"<for(intp1=0;p1
for(intq1=0;q1<32;q1++)
if(a[p1][q1]==1)
s=s+1;
s=(g*1024)/m-s;
cout<<"剩余盘块数:
"<
}
voidmain()
{intI,l,b,i,j,ss1,ss2,sum=0;
charfname[20];
fdatabasep;
filew;
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<cout<<"请输入盘块大小MB:
";
cin>>m;
cout<I=(g*1024)/(32*m);
for(i=0;i
for(j=0;j<32;j++)
a[i][j]=0;
cout<<"建立的位示图为:
"<bit_map(I);
cout<<"行数:
"<
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";
charchoice;
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显示文件列表"<cout<<"请输入选择项:
";
cin>>choice;
cout<switch(choice)
{
case'1':
cout<<"请输入文件名:
";
cin>>fname;
cout<intq;
q=p.search(fname);
if(q==0)
{cout<<"!
!
!
该文件已存在,不能创建!
!
!
\n\n";
break;
}
cout<<"请输入文件大小MB:
";
cin>>l;
cout<if(l>g*1024)
{cout<<"!
!
!
文件大小超过磁盘最大容量,无法进行分配!
!
!
"<break;}
p.creatfile(fname,l,b,ss1,ss2);
break;
case'2':
cout<<"请输入文件名:
";
cin>>fname;
cout<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<break;
case'4':
cout<<"\t\t*************文件列表如下************************\n";
cout<<"---------------------------------------------------------------"<cout<p.disp();
cout<break;
default:
cout<<"输入错误,请从新输入:
\n\n";
break;
}
}
}
五、课程设计程序运行结果
1、初始化,建立文件系统
(1)用户根据提示输入磁盘大小(GB)与每个盘块大小(MB);
(2)程序首先根据用户输入的磁盘大小(GB)与每个盘块大小(MB),自动建立位示图,即初始化位示图,位示图每一行长度固定为32位(即列固定为32);位示图中每一位表示一个盘块,取值0和1分别表示空闲和占用。
初始化的位示图应全为0;
(3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式
(行列皆从0开始编号);
这样,初始化,建立文件系统完成。
运行结果:
2、选择执行:
存储文件,删除文件,显示位示图情况,显示文件列表
【显示文件管理系统列表】显示文件系统管理列表,并提示输入信息1——4。
用户输入文件操作命令1(存储文件),2(删除文件)、3(显示位示图情况)、4(显示文件列表);
格式如下:
键入1,创建文件名为fname,大小为L(MB)的文件;
键入2,删除文件名为fname的文件;
键入3,显示位示图情况;
键入4,显示所有文件信息。
运行结果:
【存储文件】
用户输入文件操作命令是1(存储文件)。
系统提示你输入你要建立的文件名和文件大小,如果该文件名已经存在,则系统提示输出不能建立此文件的信息,否则计算所需的磁盘块数和所占用的磁盘块号,并输出结果。
相应的在位示图上,因为位示图是矩阵,可以用数组存储,根据所占用的磁盘块号和公式:
磁盘块号=行号*32+列号
行号=磁盘块号/32
列号=磁盘块号%32
计算出文件占用的磁盘块在位示图上的位置,现在是创建文件,所以将位示图该位置上的二进制数置1,表示已分配出去。
分别创建名为ll,zz和mm三个文件,文件大小分别为224MB,320MB和56MB。
此时对应的位示图如下:
文件列表如下:
若再创建一个已经创建过的文件,则显示如下信息:
若创建的文件大小超过磁盘的最大容量,则显示如下信息:
【删除文件】
用户输入文件操作命令是2(删除文件)。
系统提示你输入要删除的文件名,如果该文件名不存在,则输出删除出错信息。
在位示图上,根据所占用的磁盘块号和公式:
磁盘块号=行号*32+列号
行号=磁盘块号/32
列号=磁盘块号%32
计算出文件占用的磁盘块在位示图上的位置,现在是删除文件,所以将位示图该位置上的二进制数置0,表示收回该文件所占用的磁盘块。
删除第二个文件zz,结果如下:
则相应的位示图和文件列表变为:
若删除一个不存在的文件,则显示如下信息:
【显示位示图情况】
如果用户输入文件操作命令是我wst()(显示位示图情况),系统输出此时位示图的情况,状态位为'0'表示对应盘块空闲,状态位为'1'表示该盘块已被分配出去。
系统再显示剩余磁盘块的数目。
以下是删除zz文件,创建xx后和创建xx后,删除ll的位示图:
【显示文件列表】
如果用户输入文件操作命令是disp()(显示所有文件情况),系统会显示所有文件的文件名,文件大小,占用的盘块数和盘块号。
以下是删除zz文件,创建xx后和创建xx后,删除ll显示的文件列表: