模拟文件系统的设计与实现Word格式文档下载.docx
《模拟文件系统的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《模拟文件系统的设计与实现Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
exit
系统执行流程图
3.详细设计
主要数据结构:
#defineMEM_D_SIZE1024*1024//总磁盘空间为1M
#defineDISKSIZE1024//磁盘块的大小1K
#defineDISK_NUM1024//磁盘块数目1K
#defineFATSIZEDISK_NUM*sizeof(structfatitem)//FAT表大小
#defineROOT_DISK_NOFATSIZE/DISKSIZE+1//根目录起始盘块号
#defineROOT_DISK_SIZEsizeof(structdirect)//根目录大小
#defineDIR_MAXSIZE1024//路径最大长度为1KB
#defineMSD5//最大子目录数5
#defineMOFN5//最大文件深度为5
#defineMAX_WRITE1024*128//最大写入文字长度128KB
structfatitem/*size8*/
{
intitem;
/*存放文件下一个磁盘的指针*/
charem_disk;
/*磁盘块是否空闲标志位0空闲*/
};
structdirect
/*-----文件控制快信息-----*/
structFCB
{
charname[9];
/*文件/目录名8位*/
charproperty;
/*属性1位目录0位普通文件*/
intsize;
/*文件/目录字节数、盘块数)*/
intfirstdisk;
/*文件/目录起始盘块号*/
intnext;
/*子目录起始盘块号*/
intsign;
/*1是根目录0不是根目录*/
}directitem[MSD+2];
structopentable
structopenttableitem
/*文件名*/
/*起始盘块号*/
/*文件的大小*/
}openitem[MOFN];
intcur_size;
/*当前打文件的数目*/
管理文件的主要代码:
intcreate(char*name)
inti,j;
if(strlen(name)>
8)/*文件名大于8位*/
return(-1);
for(j=2;
j<
MSD+2;
j++)/*检查创立文件是否与已存在的文件重名*/
if(!
strcmp(cur_dir->
directitem[j].name,name))
break;
}
if(j<
MSD+2)/*文件已经存在*/
return(-4);
for(i=2;
i<
i++)/*找到第一个空闲子目录*/
if(cur_dir->
directitem[i].firstdisk==-1)
if(i>
=MSD+2)/*无空目录项*/
return(-2);
if(u_opentable.cur_size>
=MOFN)/*打开文件太多*/
return(-3);
for(j=ROOT_DISK_NO+1;
DISK_NUM;
j++)/*找到空闲盘块j后退出*/
if(fat[j].em_disk=='
0'
)
if(j>
=DISK_NUM)
return(-5);
fat[j].em_disk='
1'
;
/*将空闲块置为已经分配*/
/*-----------填写目录项-----------------*/
strcpy(cur_dir->
directitem[i].name,name);
cur_dir->
directitem[i].firstdisk=j;
directitem[i].size=0;
directitem[i].next=j;
directitem[i].property='
/*---------------------------------*/
fd=open(name);
return0;
}
intopen(char*name)
inti,j;
i++)/*文件是否存在*/
directitem[i].name,name))
=MSD+2)
/*--------是文件还是目录-----------------------*/
if(cur_dir->
directitem[i].property=='
)
/*--------文件是否打开-----------------------*/
for(j=0;
MOFN;
j++)
strcmp(u_opentable.openitem[j].name,name))
MOFN)/*文件已经打开*/
=MOFN)/*文件打开太多*/
/*--------查找一个空闲用户打开表项-----------------------*/
if(u_opentable.openitem[j].firstdisk==-1)
/*--------------填写表项的相关信息------------------------*/
u_opentable.openitem[j].firstdisk=cur_dir->
directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size=cur_dir->
directitem[i].size;
u_opentable.cur_size++;
/*----------返回用户打开表表项的序号--------------------------*/
return(j);
intclose(char*name)
inti;
for(i=0;
i++)
strcmp(u_opentable.openitem[i].name,name))
=MOFN)
/*-----------清空该文件的用户打开表项的内容---------------------*/
strcpy(u_opentable.openitem[i].name,"
"
);
u_opentable.openitem[i].firstdisk=-1;
u_opentable.openitem[i].size=0;
u_opentable.cur_size--;
intwrite(intfd,char*buf,intlen)
char*first;
intitem,i,j,k;
intilen1,ilen2,modlen,temp;
/*----------用$字符作为空格#字符作为换行符-----------------------*/
charSpace=32;
charEndter='
\n'
len;
if(buf[i]=='
$'
buf[i]=Space;
elseif(buf[i]=='
#'
buf[i]=Endter;
/*----------读取用户打开表对应表项第一个盘块号-----------------------*/
item=u_opentable.openitem[fd].firstdisk;
/*-------------找到当前目录所对应表项的序号-------------------------*/
directitem[i].firstdisk==item)
temp=i;
/*-存放当前目录项的下标-*/
/*------找到的item是该文件的最后一块磁盘块-------------------*/
while(fat[item].item!
=-1)
item=fat[item].item;
/*-查找该文件的下一盘块--*/
/*-----计算出该文件的最末地址-------*/
first=fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>
len)
strcpy(first,buf);
u_opentable.openitem[fd].size=u_opentable.openitem[fd].size+len;
cur_dir->
directitem[temp].size=cur_dir->
directitem[temp].size+len;
else
for(i=0;
(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
{/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/
first[i]=buf[i];
}
/*-----计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储-------*/
ilen1=len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2=ilen1/DISKSIZE;
modlen=ilen1%DISKSIZE;
if(modlen>
0)
ilen2=ilen2+1;
/*--还需要多少块磁盘块-*/
for(j=0;
ilen2;
{
for(i=ROOT_DISK_NO+1;
i++)/*寻找空闲磁盘块*/
{
if(fat[i].em_disk=='
break;
}
if(i>
=DISK_NUM)/*--如果磁盘块已经分配完了-*/
return(-1);
first=fdisk+i*DISKSIZE;
/*--找到的那块空闲磁盘块的起始地址-*/
if(j==ilen2-1)/*--如果是最后要分配的一块-*/
for(k=0;
k<
len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;
k++)
first[k]=buf[k];
else/*-如果不是要最后分配的一块--*/
DISKSIZE;
first[k]=buf[k];
fat[item].item=i;
/*--找到一块后将它的序号存放在上一块的指针中-*/
fat[i].em_disk='
/*--置找到的磁盘快的空闲标志位为已分配-*/
fat[i].item=-1;
/*--它的指针为-1(即没有下一块)-*/
/*--修改长度-*/
intread(intfd,char*buf)
intlen=u_opentable.openitem[fd].size;
inti,j,item;
intilen1,modlen;
ilen1=len/DISKSIZE;
modlen=len%DISKSIZE;
if(modlen!
=0)
ilen1=ilen1+1;
/*--计算文件所占磁盘的块数-*/
first=fdisk+item*DISKSIZE;
/*--计算文件的起始位置-*/
ilen1;
if(i==ilen1-1)/*--如果在最后一个磁盘块-*/
for(j=0;
len-i*DISKSIZE;
buf[i*DISKSIZE+j]=first[j];
else/*--不在最后一块磁盘块-*/
item=fat[item].item;
/*-查找下一盘块-*/
first=fdisk+item*DISKSIZE;
intdel(char*name)
inti,cur_item,item,temp;
i++)/*--查找要删除文件是否在当前目录中-*/
cur_item=i;
/*--用来保存目录项的序号,供释放目录中-*/
=MSD+2)/*--如果不在当前目录中-*/
directitem[cur_item].property!
='
)/*--如果删除的(不)是目录-*/
i++)/*--如果文件打开,则不能删除,退出-*/
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='
item=temp;
/*-----------------释放目录项-----------------------*/
directitem[cur_item].sign=0;
directitem[cur_item].firstdisk=-1;
strcpy(u_opentable.openitem[cur_item].name,"
directitem[cur_item].next=-1;
directitem[cur_item].property='
directitem[cur_item].size=0;
主函数:
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("
disk.dat"
"
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)
%s"
a);
11;
if(!
strcmp(code[i],a))
break;
switch(i)
case0:
//退出文件系统
free(contect);
halt();
case1:
//创立文件
scanf("
name);
flag=create(name);
if(flag==-1)
printf("
Error:
\nThelengthistoolong!
\n"
elseif(flag==-2)
\nThedirectitemisalreadyfull!
elseif(flag==-3)
\nThenumberofopenfileistoomuch!
elseif(flag==-4)
\nThenameisalreadyinthedirect!
elseif(flag==-5)
\nThediskspaceisfull!
else
Successfullycreateafile!
show();
case2:
//打开文件
fd=open(name);