实验4 文件系统模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;