1、每个目录项16个字节,目录项下只允许建立4个子目录或者文件。i-node位图1块64个字节,共512位,可以描述512个i-node的使用情况。i-node的长度是16字节。文件超过两个盘块会用到一级索引。每个以及索引盘块(64字节)可以包含16个盘块号。文件包含目录文件和文本文件。实现Format,Mkfile,Mkdir,Cd,Delfile,Deldir,Dir,Copy,Open,Viewinodebitmap,Viewblockbitmap等功能。二、整体功能及设计(功能划分及流程图)1、数据结构:struct DirectoryEntry /目录项 char name8; /文件或
2、目录名 int dirid; /目录标志(0为文件,1为目录) int inodenumber; /i-node编号;struct DirectoryEntryInBlock DirectoryEntry de4; /每个目录项大小为16字节,64字节空间最多可以存储4个目录项 int num; /磁盘块存储的目录项数目struct indexaddressstruct int indexaddress16; /每个索引块大小为4字节,64字节空间最多可以存储16个索引块号 /索引块存储的索引数目union Block /单个盘块64个字节大小可以存储文件内容或者存储目录项或者存储索引块号 c
3、har space64; /空间大小为64个字节用于存储文件内容 DirectoryEntryInBlock deib; indexaddressstruct ias; struct inodeStruct /i-node结构 int blockamount; /盘块数 int directblockaddress1,directblockaddress2; /直接盘块地址*2 int stairindexaddress; /一级索引地址struct DiskBlock /磁盘布局 DirectoryEntry rootdirectory4; /根目录,最多4个目录项 char inodebi
4、tmap512; /512个i-node状态 char blockbitmap1024; /1024个磁盘块状态 inodeStruct inode512; /512个i-node存储区 Block datablock1024; /数据块存储区static DiskBlock db; /全局磁盘变量int rootdirectoryamount; /用于记录根目录的使用数目,最大为4int inodeamount; /用于记录i-node的使用数目,最大为512int datablockamount; /用于记录数据块的使用数目,最大为1024int spaceamount; /用于记录数据块
5、中64位字节的使用数目,最大为64DirectoryEntry filelist500; /用于记录文件方便遍历检索DirectoryEntry directorylist500; /用于记录目录方便int fileamount; /用于记录文件数目int directoryamount; /用于记录目录的数目char localposition8; /用于记录当前位置 2、文件系统相关图(1)文件系统简单结构图如图1所示。图1 文件系统简单结构图(2)磁盘构成示意图如图2所示图2 磁盘构成示意图(3)文件构成图如图3所示。文件或目录名目录标志I-node编号图3 文件构成图(4)I-node
6、构成图如图4所示。图4 I-node构成图三、编程实现:(主要功能代码及解释)void Format() /初始化 int i,j; for(i=0;i4;i+) memset(db.rootdirectoryi.name,0,8); /给文件或目录名初始化 db.rootdirectoryi.dirid=-1; db.rootdirectoryi.inodenumber=-1; 512; db.inodebitmapi=0; db.inodei.blockamount=0; db.inodei.directblockaddress1=-1; db.inodei.directblockaddr
7、ess2=-1; db.inodei.stairindexaddress=-1;1024;i+) db.blockbitmapi=0; memset(db.datablocki.space,0,64); /给单个盘块的64字节空间初始化 db.datablocki.deib.num=0; db.datablocki.ias.num=0; for(j=0;jj+) db.datablocki.deib.dej.inodenumber=-1;j+) db.datablocki.ias.indexaddressj=-1;500; memset(filelisti.name,0,8); filelis
8、ti.dirid=-1; filelisti.inodenumber=-1; memset(directorylisti.name,0,8); directorylisti.dirid=-1; directorylisti.inodenumber=-1; rootdirectoryamount=0; inodeamount=0; datablockamount=0; spaceamount=0; fileamount=0; directoryamount=0; strcpy(localposition,Root);void Mkfile() /创建文件 char filename8,path1
9、0; printf(文件名称: scanf(%s,filename);文件路径:,path); if(strcmp(path,)=0) if(rootdirectoryamount printf(创建失败,该目录已满n break; else strcpy(db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.name,filename); db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detn
10、um.dirid=0; db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.inodenumber=inodeamount; db.inodeinodeamount.blockamount=1; db.inodeinodeamount.directblockaddress1=datablockamount; db.inodebitmapinodeamount=1; db.blockbitmapdatablockamount=1; filelistfileamount=db.databloc
11、kdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum; inodeamount+; datablockamount+; fileamount+; db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.num+; printf( break; if(i=directoryamount)创建失败,路径有误nvoid Mkdir() /创建目录 char directoryname8,path10;目录名称:,directoryn
12、ame);目录路径: strcpy(db.rootdirectoryrootdirectoryamount.name,directoryname); db.rootdirectoryrootdirectoryamount.dirid=1; directorylistdirectoryamount=db.rootdirectoryrootdirectoryamount; directoryamount+;目录创建成功n else strcpy(db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnu
13、m.name,directoryname); db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.dirid=1; directorylistdirectoryamount=db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum; inodeamount+; directoryamount+;void Cd() /更改当前目录项请输入当前目录为:,localposition);当前目录位置
14、修改成功nvoid Delfile() /删除文件 char filename8; int i,j,k,flag;请输入要删除的文件的名称: for(k=0;krootdirectoryamount;k+) if(strcmp(db.rootdirectoryk.name,filename)=0) memset(db.rootdirectoryk.name,0,8); db.rootdirectoryk.dirid=-1; db.rootdirectoryk.inodenumber=-1; break; for(j=0;db.datablockdb.inodedirectorylistk.in
15、odenumber.directblockaddress1.deib.num;j+) if(strcmp(db.datablockdb.inodedirectorylistk.inodenumber.directblockaddress1.deib.dej.name,filename)=0) memset(db.datablockdb.inodedirectorylistk.inodenumber.directblockaddress1.deib.dej.name,0,8); db.datablockdb.inodedirectorylistk.inodenumber.directblocka
16、ddress1.deib.dej.dirid=-1; db.datablockdb.inodedirectorylistk.inodenumber.directblockaddress1.deib.dej.inodenumber=-1;fileamount; if(strcmp(filename,filelisti.name)=0) flag=i; if(db.inodefilelisti.inodenumber.blockamount=1) memset(db.datablockdb.inodefilelisti.inodenumber.directblockaddress1.space,0
17、,64); db.inodefilelisti.inodenumber.blockamount=0; db.inodebitmapfilelisti.inodenumber=0; db.blockbitmapdb.inodefilelisti.inodenumber.directblockaddress1=0; db.inodefilelisti.inodenumber.directblockaddress1=-1;文件删除成功n else if(db.inodefilelisti.inodenumber.blockamount=2) memset(db.datablockdb.inodefi
18、lelisti.inodenumber.directblockaddress2.space,0,64); db.blockbitmapdb.inodefilelisti.inodenumber.directblockaddress2=0; db.inodefilelisti.inodenumber.directblockaddress2=-1; else int temp=db.inodefilelisti.inodenumber.blockamount-2; db.blockbitmapdb.inodefilelisti.inodenumber.stairindexaddress=0; for(int j=0;temp; int temp1=db.data