实验4 文件系统模拟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验4 文件系统模拟

一、实验目的:

设计和实现基于FAT12的模拟磁盘卷及其I/O系统的文件存取操作基本功能函数,深入领会和理解文件系统的体系结构、工作原理和设计要领。

二、实验设计

1.根据FAT12设计模拟磁盘(1.44MB软盘映像文件)的磁盘组

织结构及文件或空闲盘块管理方法与描述用数据结构,并实现

模拟磁盘的创建和格式化操作。

2.设计和实现模拟磁盘I/O操作暨物理盘块与缓冲区(缓冲区与

物理盘块大小相同)间数据交互的两个函数。

3.构建和提供用户与文件系统之间的基本接口,包括目录和文件

的创建、重命名、删除和显示操作,目录的进入操作以及文件

的定位及读、写操作。

4.测试系统功能并给出有效证据。

三、源程序清单和说明

#include

#include

#include

#define BlockSize 512

#define DirSize 32

#define RootSize 2

struct ReserveBlock{

int sysblocknum;/*文件系统总扇区数*/

int resblocknum;/*保留扇区扇区数*/

int fatblocknum;/*FA T表扇区数*/

int rootblocknum;/*根目录区扇区数*/

char fillchar[BlockSize-4*sizeof(int)];/*填充字节*/

};

struct DirBlock{

char filename[11]; /*文件名限长11个字符*/

char

fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11];/*填充字节*/

long filelen; /*文件长度*/

int year,month,day; /*日期*/

int firstblockaddr; /*文件首块扇区号*/

};

struct FCBBlock{

int fileid; /*文件标识*/

struct DirBlock fileinfo; /*目录信息*/

long filepos; /*文件读写指针*/

int fdtblockaddr; /*目录项所在块号*/

int fdtblockindex; /*目录项所在块内序号*/

struct FCBBlock *next;/*指向下一个文件控制块的指针*/

};

struct ReserveBlock sys1;

struct FCBBlock *fcb;

struct DirBlock fil[32],*dir;/*目录项*/ int *fat1;

char *str,*ptr;

char fillchar[BlockSize];

FILE *fp;

FILE *OPENSYS(char *filename){

int i;

fp=fopen(filename,"rb+");

fread(&sys1,1,BlockSize,fp);

fat1=(int *)malloc(sys1.sysblocknum);

for(i=0;i

fread(fat1,sizeof(int)*sys1.sysblocknum,1,fp); /*把基本的文件系统都读进来*/

fseek(fp,(sys1.fatblocknum+sys1.resblocknum )*BlockSize,0);/*修改文件指针的位置*/ dir=fil;/*目录指针*/

fread(dir,DirSize*32,1,fp);

return fp;

}

int CLOSESYS(FILE *stream){

int i;

fseek(stream,sys1.resblocknum*BlockSize,0);

fwrite(fat1,sizeof(int)*sys1.sysblocknum,1,str eam);

fseek(fp,(sys1.fatblocknum+sys1.resblocknum )*BlockSize,0);

fwrite(dir,DirSize*32,1,fp);

fclose(fp);

return 1;

}

int FCREA TE(char *filename)/*建立文件*/ {

int i,flag=0,j,k=0,flag1=0,flag2=0,a;

int n,m;

while(1)

{a=strlen(filename);/*文件名长度*/

if(a>10)

{printf("文件名过长\n");

printf("请重新输入:");

scanf("%s",filename);

}

else

break;

}

while(1){

for(i=0;i<32;i++)

if(strcmp(filename,fil[i].filename)==0){

printf("该文件名已存在\n");

printf("请重新输入:");

flag1=1;

break;

}

if(flag1==0)

break;

scanf("%s",filename);

flag1=0;

}

for(i=(sys1.fatblocknum+sys1.resblocknum+s ys1.rootblocknum);i

flag++;/*统计磁盘上为空数目*/

if(flag==0)

{ printf("磁盘已满");/*统计结果为0,则磁盘已满*/

return 0;

}

printf("空闲块数:%d\n",flag);

printf("请输入文件长度:");

for(j=0;j<32;j++)

if(fil[j].firstblockaddr==0)

break;

while(1)

{scanf("%d",&dir[j].filelen);/*输入目录项中文件的长度*/

n=(dir[j].filelen/BlockSize)+(dir[j].filelen%Bl ockSize?1:0);

if(n<0||n>flag)/*文件长度小于0或大于空闲的空间*/

{printf("文件长度过长\n");

printf("请重新输入:");

}

else

break;

}

for(i=(sys1.fatblocknum+sys1.resblocknum+s ys1.rootblocknum);i

{ if(fat1[i]==0){

k++;

if(flag2==0)

{ dir[j].firstblockaddr=i+1;

flag2=1;

}

else

{ if(k>=n)/*n 文件长度*/

{ fat1[m]=i+1;

fat1[i]=-1;

break;

}

else

fat1[m]=i+1;

}

m=i;

}

}

strcpy(dir[j].filename,filename);

dir[j].filename[a]='\0';

printf("请输入年份:");

scanf("%d",&dir[j].year);

printf("请输入月份:");

scanf("%d",&dir[j].month);

printf("请输入日期:");

scanf("%d",&dir[j].day);

return (1);

}

void LISTDIR(void)/*显示目录*/

{

int i,flag=0;

相关文档
最新文档