模拟文件系统的设计与实现.docx
《模拟文件系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《模拟文件系统的设计与实现.docx(16页珍藏版)》请在冰豆网上搜索。
![模拟文件系统的设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/19/50a0031c-4b05-40f6-bf65-d135dad20074/50a0031c-4b05-40f6-bf65-d135dad200741.gif)
模拟文件系统的设计与实现
模拟文件系统的设计与实现
中北大学
操作系统课程设计
说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
xxx
学号:
xxx
设计题目:
模拟文件系统的设计与实现
起迄日期:
2015年12月28日-2016年1月8日
指导教师:
xxx
2016年1月8日
1需求分析
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
2总体设计
结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
文件的创建:
create文件关闭:
close文件的打开:
open
文件的读:
read文件的写:
write文件关闭:
close
删除文件:
delete创建子目录:
mkdir删除子目录:
rmdir
列出文件目录:
dir退出:
exit
系统执行流程图
3.详细设计
主要数据结构:
#defineMEM_D_SIZE1024*1024ame,name))
break;
}
if(jreturn(-4);
for(i=2;i{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
if(i>=MSD+2)/*无空目录项*/
return(-2);
if>=MOFN)/*打开文件太多*/
return(-3);
for(j=ROOT_DISK_NO+1;j{
if(fat[j].em_disk=='0')
break;
}
if(j>=DISK_NUM)
return(-5);
fat[j].em_disk='1';/*将空闲块置为已经分配*/
/*-----------填写目录项-----------------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk=j;
cur_dir->directitem[i].size=0;
cur_dir->directitem[i].next=j;
cur_dir->directitem[i].property='0';
/*---------------------------------*/
fd=open(name);
return0;
}
intopen(char*name)
{
inti,j;
for(i=2;i{
if(!
strcmp(cur_dir->directitem[i].name,name))
break;
}
if(i>=MSD+2)
return(-1);
/*--------是文件还是目录-----------------------*/
if(cur_dir->directitem[i].property=='1')
return(-4);
/*--------文件是否打开-----------------------*/
for(j=0;j{
if(!
strcmp[j].name,name))
break;
}
if(jreturn(-2);
if>=MOFN)/*文件打开太多*/
return(-3);
/*--------查找一个空闲用户打开表项-----------------------*/
for(j=0;j{
if[j].firstdisk==-1)
break;
}
/*--------------填写表项的相关信息------------------------*/
[j].firstdisk=cur_dir->directitem[i].firstdisk;
strcpy[j].name,name);
[j].size=cur_dir->directitem[i].size;
++;
/*----------返回用户打开表表项的序号--------------------------*/
return(j);
}
intclose(char*name)
{
inti;
for(i=0;i{
if(!
strcmp[i].name,name))
break;
}
if(i>=MOFN)
return(-1);
/*-----------清空该文件的用户打开表项的内容---------------------*/
strcpy[i].name,"");
[i].firstdisk=-1;
[i].size=0;
;
return0;
}
intwrite(intfd,char*buf,intlen)
{
char*first;
intitem,i,j,k;
intilen1,ilen2,modlen,temp;
/*----------用$字符作为空格#字符作为换行符-----------------------*/
charSpace=32;
charEndter='\n';
for(i=0;i{
if(buf[i]=='$')
buf[i]=Space;
elseif(buf[i]=='#')
buf[i]=Endter;
}
/*----------读取用户打开表对应表项第一个盘块号-----------------------*/
item=[fd].firstdisk;
/*-------------找到当前目录所对应表项的序号-------------------------*/
for(i=2;i{
if(cur_dir->directitem[i].firstdisk==item)
break;
}
temp=i;/*-存放当前目录项的下标-*/
/*------找到的item是该文件的最后一块磁盘块-------------------*/
while(fat[item].item!
=-1)
{
item=fat[item].item;/*-查找该文件的下一盘块--*/
}
/*-----计算出该文件的最末地址-------*/
first=fdisk+item*DISKSIZE+[fd].size%DISKSIZE;
/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/
if[fd].size%DISKSIZE>len)
{
strcpy(first,buf);
[fd].size=[fd].size+len;
cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<[fd].size%DISKSIZE);i++)
{/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/
first[i]=buf[i];
}
/*-----计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储-------*/
ilen1=len-[fd].size%DISKSIZE);
ilen2=ilen1/DISKSIZE;
modlen=ilen1%DISKSIZE;
if(modlen>0)
ilen2=ilen2+1;/*--还需要多少块磁盘块-*/
for(j=0;j{
for(i=ROOT_DISK_NO+1;i{
if(fat[i].em_disk=='0')
break;
}
if(i>=DISK_NUM)/*--如果磁盘块已经分配完了-*/
return(-1);
first=fdisk+i*DISKSIZE;/*--找到的那块空闲磁盘块的起始地址-*/
if(j==ilen2-1)/*--如果是最后要分配的一块-*/
{
for(k=0;kfirst[k]=buf[k];
}
else/*-如果不是要最后分配的一块--*/
{
for(k=0;kfirst[k]=buf[k];
}
fat[item].item=i;/*--找到一块后将它的序号存放在上一块的指针中-*/
fat[i].em_disk='1';/*--置找到的磁盘快的空闲标志位为已分配-*/
fat[i].item=-1;/*--它的指针为-1(即没有下一块)-*/
}
/*--修改长度-*/
[fd].size=[fd].size+len;
cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;
}
return0;
}
intread(intfd,char*buf)
{
intlen=[fd].size;
char*first;
inti,j,item;
intilen1,modlen;
item=[fd].firstdisk;
ilen1=len/DISKSIZE;
modlen=len%DISKSIZE;
if(modlen!
=0)
ilen1=ilen1+1;/*--计算文件所占磁盘的块数-*/
first=fdisk+item*DISKSIZE;/*--计算文件的起始位置-*/
for(i=0;i{
if(i==ilen1-1)/*--如果在最后一个磁盘块-*/
{
for(j=0;jbuf[i*DISKSIZE+j]=first[j];
}
else/*--不在最后一块磁盘块-*/
{
for(j=0;jbuf[i*DISKSIZE+j]=first[j];
item=fat[item].item;/*-查找下一盘块-*/
first=fdisk+item*DISKSIZE;
}
}
return0;
}
intdel(char*name)
{
inti,cur_item,item,temp;
for(i=2;i{
if(!
strcmp(cur_dir->directitem[i].name,name))
break;
}
cur_item=i;/*--用来保存目录项的序号,供释放目录中-*/
if(i>=MSD+2)/*--如果不在当前目录中-*/
return(-1);
if(cur_dir->directitem[cur_item].property!
='0')/*--如果删除的(不)是目录-*/
return(-3);
for(i=0;i{
if(!
strcmp[i].name,name))
return(-2);
}
item=cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/
while(item!
=-1)/*--释放空间,将FAT表对应项进行修改-*/
{
temp=fat[item].item;
fat[item].item=-1;
fat[item].em_disk='0';
item=temp;
}
/*-----------------释放目录项-----------------------*/
cur_dir->directitem[cur_item].sign=0;
cur_dir->directitem[cur_item].firstdisk=-1;
strcpy[cur_item].name,"");
cur_dir->directitem[cur_item].next=-1;
cur_dir->directitem[cur_item].property='0';
cur_dir->directitem[cur_item].size=0;
return0;
}
主函数:
intmain()
{
FILE*fp;
charch;
chara[100];
charcode[11][10];
charname[10];
inti,flag,r_size;
char*contect;
contect=(char*)malloc(MAX_WRITE*sizeof(char));
if((fp=fopen("","rb"))==NULL)
{
printf("Youhavenotformat,Doyouwantformat(y/n)");
scanf("%c",&ch);
if(ch=='y')
{
initfile();
printf("Successfullyformat!
\n");
}
else
{
return0;
}
}
enter();
print();
show();
strcpy(code[0],"exit");
strcpy(code[1],"create");
strcpy(code[2],"open");
strcpy(code[3],"close");
strcpy(code[4],"write");
strcpy(code[5],"read");
strcpy(code[6],"del");
strcpy(code[7],"mkdir");
strcpy(code[8],"rmdir");
strcpy(code[9],"dir");
strcpy(code[10],"cd");
while
(1)
{
scanf("%s",a);
for(i=0;i<11;i++)
{
if(!
strcmp(code[i],a))
break;
}
switch(i)
{
case0:
ize;i++)
{
printf("%c",contect[i]);
}
printf("\t\n");
}
}
show();
break;
case6:
//删除文件
scanf("%s",name);
flag=del(name);
if(flag==-1)
{
printf("Error:
\nThefilenotexit!
\n");
}
elseif(flag==-2)
{
printf("Error:
\nThefileisopened,pleasefirstcloseit!
\n");
}
elseif(flag==-3)
{
printf("Error:
\nThedeleteisnotfile!
\n");
}
else
{
printf("Successfullydelete!
\n");
}
show();
break;
}
}
}
程序运行截图:
4.心得体会
在设计的过程中,我查询了不少相关资料,不断地发现问题、提出问题、解决问题。
用C做程序开发语言,让我重新认识了C的基础,在新语言不断出现并发展迅速的今天,重新体会到C的基础性、重要性,以及面对过程,面对函数式的编程方式。
在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程更简单,可以使我们的查错与纠错变得更加方便。
总的来说通过这次的设计学习使我学到了很多在平时的学习中学不到的很多东西,对操作系统有了更深一层的了解,同时也提高了C语言的能力,由于时间以及个人知识的问题,因此有很多的地方还需要改进。
在以后的学习中还要更加努力。