操作系统课程设计++模拟磁盘文件管理的程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“操作系统模拟文件管理”。
中南林业科技大学
操作系统课程设计
课程题目:模拟磁盘文件管理的程序
姓名: 学号:
专业: 计算机科学与技术 年级:
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
存 储 文 件nnttt2
删 除 文 件 nnttt3 显示位示图情况 nnttt4 显示文件列表“> 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显示的文件列表:
沈阳理工大学课程设计专用纸 Noi目 录 1 课程设计目的及要求……………………………………………………错误!未定义书签。 2 相关知识……………………………………......
1.实验题目:磁盘调度算法。 建立相应的数据结构;在屏幕上显示磁盘请求的服务状况;将一批磁盘请求的情况存磁盘文件,以后可以读出并重放; 计算磁头移动的总距离及平均移动距离; 支......
大学操作系统课程综合实践题目:磁盘文件操作班级:姓名:学号:指导教师:2011年 12 月 23日磁盘文件操作摘要:为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,......
#include "stdio.h" #include "string.h" #include "malloc.h"#include "stdlib.h"#define MAX 1000 struct file/*普通文件的结构体*/ { //int type;//0无作用,当......
操作系统课程设计注意事项:0.请每位同学必须按时提交课程设计报告(包括电子版和纸质版),算入期末成绩1.在三个题目中选择一个2.如果选择题目(一)进程调度算法,要求实现其中2个以上(......