中南林业科技大学
操作系统课程设计
课程题目:模拟磁盘文件管理的程序
姓名: 学号:
专业: 计算机科学与技术 年级:
2006
计算机科学学院
2008年11月 模拟磁盘文件管理的程序
一、课程设计内容
⑴ 自定义磁盘文件管理的数据结构; ⑵ 能够自由创建、修改、删除文件; ⑶ 文件具有一定自定义的属性; ⑷ 能够显示当前系统文件的状态。
二、课程设计的数据结构说明
程序中定义了两个类: cla file//文件类 {private: char name[10]; //文件名 public: int tag; //删除标记 1:已删 0:未删 file( ){ } char *getname( ){return name;} //获取文件名
int gettag( ){return tag;} //获取删除标记
int getlength() {return length;} //获取文件大小
int getblocknum() {return blocknum;} // 磁盘块数
int getblocksum1(){return blocksum1;} //磁盘块号的始点 int getblocksum2(){return blocksum2;} //磁盘块号的终点 int length,blocknum,blocksum1,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) //创建文件 void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件 void disp( )//输出文件信息 cla fdatabase //文件库类 { private: int top; //文件记录指针 file f[50]; public: fdatabase(){top=-1;} //构造函数 int search(char *fname)//按文件名查找
int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在
int deltefile(char *na)//删除文件时先查找是否存在 void disp() //输出所有文件信息 };
三、课程设计的模板说明
1、初始化,建立文件系统
输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位
输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。
2、循环选择执行以下功能
1、存储文件
输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数
为其分配足够多的磁盘块,并记录下来 输出所占用的磁盘块号
2、删除文件
输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块 删除该文件名
3、显示位示图情况
显示位示图的情况 显示剩余磁盘块的数目
4、显示文件列表
显示文件名,文件大小,占用的磁盘块数目和磁盘块号
四、课程设计的源代码
#include #include #include #include #include int i=0,j=0,sum=0,tt=0,r,ii,k,g,m; int a[100][32]; cla 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
for(;j
a[i][j]=1; i=i+1; for(j=0;j
{
a[i][j]=1; } sum=sum+blocknum-32; } tt=tt+blocknum; //输出文件所占用的盘块号
cout
{
for ( ii=0;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
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
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
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
a[x][k]=0;
x=n2; //对剩余项赋值
for(k=0;k
a[x][k]=0;
} else //对当前文件前几项赋值
{ x=n1;
for(k=q1;k
a[x][k]=0; x=x+1; int t1=t;
for(;t-1>0;t--,x++) //中间整行赋值
for(k=0;k
a[x][k]=0;
x=n2; //最后剩余项赋值
for(k=0;k
a[x][k]=0;
}
} return 1; } } else
{cout
return 0;}
} void disp() //输出所有文件信息 { for (int i=0;i
if(f[i].tag==0)
f[i].disp(); } }; void bit_map(int I) { int s=0; cout
cout
out>g; cout>m; cout
a[i][j]=0;
cout
cout
cout
存 储 文 件\\n\\n\\t\\t\\t2
删 除 文 件 \\n\\n\\t\\t\\t3 显示位示图情况 \\n\\n\\t\\t\\t4 显示文件列表\"> choice; cout
case \'1\':
cout
cin>>fname;
cout
int q; q=p.search(fname);
if (q==0)
{ cout
break; }
cout
cin>>l;
cout
if(l>g*1024)
{cout
break;}
p.creatfile(fname,l,b,1,2);
break;
case \'2\':
cout
cin>>fname;
cout
q=p.search(fname);
if (!q==0)
{
cout
break;
} p.deltefile(fname);
break; case \'3\':
cout
bit_map(I);
cout
break;
case \'4\': cout
p.disp();
cout
break; default:
cout
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显示的文件列表: