模拟实现单级目录、单级索引的索引文件系统_第1页
模拟实现单级目录、单级索引的索引文件系统_第2页
模拟实现单级目录、单级索引的索引文件系统_第3页
模拟实现单级目录、单级索引的索引文件系统_第4页
模拟实现单级目录、单级索引的索引文件系统_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告课程名称操作系统课题名称模拟实现单级目录、索引的系统专业计算机科学与技术班级计算机1181学号201113030128姓名蔡彪指导教师周铁山2014年01月02日湖南工程学院课程设计任务书课程名称操作系统课题模拟实现单级目录、索引的系统专业班级计算机1181学生姓名蔡彪学号201113030128指导老师周铁山审批任务书下达日期2013年12月26日任务完成日期2014年01月02日课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步稳固课堂所学知识,全面熟悉、掌握操作系统的根本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业根底。设计课题课题一:模拟实现单级目录的FAT文件系统根本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。根本设计要求:1、实现如下文件系统功能〔过程或函数〕:挂载文件系统FILE*OPENSYS(char*filename);卸载文件系统intCLOSESYS(FILE*stream);显示目录voidLISTDIR(void);建立文件intFCREATE(char*filename);删除文件intFDELETE(char*filename);翻开文件intFOPEN(char*filename);关闭文件intFCLOSE(intfileid);文件块读intFREAD(void*ptr,intn,intfileid);文件块写intFWRITE(void*ptr,intn,intfileid);判断文件结束intFEOF(intfileid);获取文件指针longFGETPOS(intfileid);设置文件指针intFSETPOS(intfileid,longoffset);取得文件长度longFGETLEN(char*filename);2、提供文件系统创立程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。文件系统空间划分:保存扇区FAT表区〔或字节映像图区〕根目录区文件分区本课题限制C语言文件操纵函数的使用,只能使用以下C语言文件操纵函数:FILE*fopen(constchar*filename,constchar*mode);intfclose(FILE*stream);intfseek(FILE*stream,longoffset,intwhence);longftell(FILE*stream);size_tfread(void*ptr,size_tsize,size_tn,FILE*stream);size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream);课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。课程设计报告要求设计报告要求A4纸打印成册;使用学院统一的封面;课程设计报告每人一份,必须包含如下几个方面的内容:根本设计思想;主要数据结构;主要实施流程;所有源代码;课程设计总结与体会。分组及选题方法按学号顺序一人一组,学号为奇数者为课题一,偶数者为课题二。成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。五、设计进度安排讲课及上机调试时间安排:上课时间:未定上机时间:其余时间:查阅资料,确定方案,设计课题相关程序。个人辩论,交课程设计报告。目录TOC\o"1-2"\h\u18861一、程序的功能 629194二、程序的根本设计思路 730438三、主要的数据结构 811248四、主要实施流程101273五、程序调试及其运行结果 1310349六、设计总结与心得体会 155983七、附录(源程序清单) 16一、程序的功能该程序主要模拟实现单级目录、单级索引的索引文件系统,该系统要求能翻开文件系统;关闭文件系统;显示目录;建立文件;删除文件;翻开文件;关闭文件;文件块读;文件块写;判断文件结束;获取文件指针;设置文件指针;取得文件长度等功能。要求使用链接域将同一文件的各索引块按顺序连接起来。二、程序的根本设计思路模拟实现单级目录、单级索引的索引文件系统根本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。在一个文件系统中对文件进行操作,实现文件的创立、读写等等操作。在创立文件时先在目录项中进行查找,假设创立的文件已存在,文件的创立首先检验目录是否为空,为空那么把文件夹或文件连接到该目录下,不为空那么把检查目录下是否有同名文件夹或文件,有那么提示创立不成功,而文件夹翻开是那么把文件夹名称及其地址压入翻开文件夹栈,文件关闭那么把文件夹名称及其地址从翻开文件夹栈中抛出。文件夹和文件的删除,文件夹下没有翻开的文件或文件没有翻开才能删除,否那么删除失败,每次操作成功都要更改目录和FCB信息。该过程都保存在文件中,是对文件的操作。本系统建于Windows平台,开发环境为WIN-TC。三、主要的数据结构1.常量#defineBlockSize512#defineDirSize322.保存扇区结构structReserveBlock{intsysblocknum;/*文件系统总扇区数*/intresblocknum;/*保存扇区扇区数*/intmapblocknum;/*字节映像图扇区数*/introotblocknum;/*根目录区扇区数*/charfillchar[BlockSize-4*sizeof(int)];/*填充字节*/};3.目录结构structDirBlock{charfilename[11];/*文件名限长11个字符*/charfillchar[DirSize-4*sizeof(int)-sizeof(longint)-11];/*填充字节*/longfilelen;/*文件长度*/intyear,month,day;/*定义年月日*/intfirstindexaddr;/*文件首索引块扇区号*/};4.索引块结构structIndexBlock{intdataaddr[BlockSize/sizeof(int)-1];/*数据块块号数组*/intnextindexaddr;/*本文件下一索引块块号*/};5.索引节点结构structIndexNode{structIndexBlockblock;/*索引块数据*/intblockaddr;/*本节点索引块块号*/structIndexNode*nextnode;/*指向下一索引节点的指针*/};6.FCB〔文件控制块〕结构structFCBBlock{intfileid;/*文件标识*/structDirBlockfileinfo;/*目录信息*/longfilepos;/*文件读写指针*/intfdtblockaddr;/*目录项所在块号*/intfdtblockindex;/*目录项所在块内序号*/structFCBBlock*next;/*指向下一个文件控制块的指针*/structIndexNode*firstindexnode;/*指向第一个索引节点的指针*/}四、相关流程图4.1创立文件流程图主界面Start输入start翻开文件系统YN输入creat来创立文件主界面Start输入start翻开文件系统YN输入creat来创立文件输入文件名,大小,创立日期判断是否重名文件创立成功文件创立失败,重新输入文件名EndNY4.2删除文件流程图创立(creat)一个文件创立(creat)一个文件Start判断是否存在该文件判断该文件是否被open输入del成功删除文件End先close关闭文件4.3FREAD函数流程图StartStarta==NullYa==Nulla->fileid==fileidNa->fileid==fileidNY(a->filepos+n)>((a->fileid*512)+a->fileinfo.filelen)(a->filepos+n)>((a->fileid*512)+a->fileinfo.filelen)Nprintf("超出空间。printf("超出空间。\n")输出字符串输出字符串输出无此fileid输出无此fileida=a->nexta=a->nextEndEnd五、程序调试及其运行结果下面是程序调试时的一些截图。图五、输入扇区块数图六、成功创立文件图七、未翻开文件,不能进行写操作图八、成功删除文件图九、文件删除之后不能翻开,显示不能找到文件设计总结与心得体会通过一个学期的学习,操作系统的课程设计也要结课了,总的来说经过这门课的学习收获还是挺大的,它不但使我更了解了课本知识,稳固了课本知识,而且也使我的编程能力有了一定的提高。这次课程设计是对操作系统的一个总结和复习的过程,课设的过程是个自我探索、自我学习的过程,其中,我们不仅学到了专业的知识,也提升了自己的学习能力。在此次课程设计中也遇到了不少的问题和困难,但是通过自己的努力和向同学讨教都把他一一的给解决了,总之,通过这次课程设计,是我对文件系统有了更深一部的了解,让我对文件系统不再陌生,当然自己还有很多缺乏的地方,希望自己在以后的学习过程中不断的改良,这样才能让自己进步,才能让自己更上一层楼。七、附录源程序代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#defineBlockSize512#defineDirSize32#defineRootSize2structReserveBlock{intsysblocknum;/*文件系统总扇区数*/intresblocknum;/*保存扇区扇区数*/intfatblocknum;/*FAT表扇区数*/introotblocknum;/*根目录区扇区数*/charfillchar[BlockSize-4*sizeof(int)];/*填充字节*/};structDirBlock{charfilename[11];/*文件名限长11个字符*/charfillchar[DirSize-4*sizeof(int)-sizeof(longint)-11];/*填充字节*/longfilelen;/*文件长度*/intyear,month,day;/*日期*/intfirstblockaddr;/*文件首块扇区号*/};structFCBBlock{intfileid;/*文件标识*/structDirBlockfileinfo;/*目录信息*/longfilepos;/*文件读写指针*/intfdtblockaddr;/*目录项所在块号*/intfdtblockindex;/*目录项所在块内序号*/structFCBBlock*next;/*指向下一个文件控制块的指针*/};structReserveBlocksys1;structFCBBlock*fcb;structDirBlockfil[32],*dir;/*目录项*/int*fat1;char*str,*ptr;charfillchar[BlockSize];FILE*fp;FILE*OPENSYS(char*filename){inti;fp=fopen(filename,"rb+");fread(&sys1,1,BlockSize,fp);fat1=(int*)malloc(sys1.sysblocknum);for(i=0;i<sys1.fatblocknum;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);returnfp;}intCLOSESYS(FILE*stream){inti;fseek(stream,sys1.resblocknum*BlockSize,0);fwrite(fat1,sizeof(int)*sys1.sysblocknum,1,stream);fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*BlockSize,0);fwrite(dir,DirSize*32,1,fp);fclose(fp);return1;}voidLISTDIR(void)/*显示目录*/{inti,flag=0;for(i=0;i<32;i++){if(fil[i].firstblockaddr!=0){if(flag==0)printf("filename\n");flag=1;/*标示*/printf("%s\n",fil[i].filename);}}}intFCREATE(char*filename)/*建立文件*/{inti,flag=0,j,k=0,flag1=0,flag2=0,a;intn,m;while(1){a=strlen(filename);/*文件名长度*/if(a>10){printf("Thisfilelengthtoolong!\n");printf("inputfilenameagain:");scanf("%s",filename);}elsebreak;}while(1){for(i=0;i<32;i++)if(strcmp(filename,fil[i].filename)==0) {printf("thenamealreadyexist\n");printf("inputnameagain:");flag1=1;break; }if(flag1==0)break;scanf("%s",filename);flag1=0;}for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i++)if(fat1[i]==0)flag++;/*统计磁盘上为空数目*/if(flag==0){printf("cipanyiman");/*统计结果为0,那么磁盘已满*/return0;}printf("kongxiankuaishu:%d\n",flag);printf("inputfilelength:");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%BlockSize?1:0);if(n<0||n>flag)/*文件长度小于0或大于空闲的空间*/{printf("inputlengthtoolong!\n");printf("inputagain:");}elsebreak;}for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;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; }elsefat1[m]=i+1; }m=i;}}strcpy(dir[j].filename,filename);dir[j].filename[a]='\0';printf("inputyear:");scanf("%d",&dir[j].year);printf("inputmonth:");scanf("%d",&dir[j].month);printf("inputday:");scanf("%d",&dir[j].day);return(1);}intFDELETE(char*filename)/*删除文件*/{inti,j,k,n,flag=0;structFCBBlock*p;/*文件控制块指针*/p=fcb;while(p){if(strcmp(filename,fil[p->fdtblockindex].filename)==0)/*目录项所在序号*/{printf("thefilehasopen,pleasecloseitbeforedelete!\n");return0;}elsep=p->next;}for(i=0;i<32;i++)/*查找要关闭的文件*/if(strcmp(filename,fil[i].filename)==0){flag=1;break;}if(flag==0){printf("filecannotfind!\n");return0;}j=fil[i].firstblockaddr;while(1){k=fat1[j-1];fseek(fp,(j-1)*BlockSize,0);/*将指针指向文件的第一个扇区的位置*/fwrite(&fillchar,1,BlockSize,fp);fat1[j-1]=0;if(k==-1)break;elsej=k;}memset(&fil[i],0,DirSize);return1;}intFOPEN(char*filename)/*翻开文件*/{inti,j=0,k,flag=0;structFCBBlock*p,*q,*r;p=fcb;for(i=0;i<32;i++)if(strcmp(filename,fil[i].filename)==0)/*找到要翻开的文件*/{flag=1;break;}if(flag==0){printf("filecannotfind!\n");return0;}while(p){j++;if(strcmp(filename,fil[p->fdtblockindex].filename)==0){printf("Thisfilehasopen!\n");return0;}q=p;p=p->next;}if(fcb==NULL){fcb=(structFCBBlock*)malloc(sizeof(structFCBBlock));fcb->fileid=j+1;/*文件标示*/fcb->filepos=0;/*文件读写指针*/fcb->next=NULL;/*指向下一个文件控制指针*/fcb->fdtblockindex=i;}else{r=(structFCBBlock*)malloc(sizeof(structFCBBlock));r->fileid=j+1;r->filepos=0;r->next=NULL;r->fdtblockindex=i;q->next=r;}/*f->next=NULL;*/return1;}longFGETLEN(intfileid)/*获取文件指针*/{structFCBBlock*p;p=fcb;while(p){if(p->fileid==fileid)/*寻找要找的指针*/return(p->filepos);p=p->next;}printf("getfaile!\n");return(0);}intFCLOSE(char*filename)/*关闭文件*/{intflag=0;structFCBBlock*f,*p;f=fcb;if(strcmp(filename,fil[fcb->fdtblockindex].filename)==0){flag=1;fcb=fcb->next;p=fcb;while(p){p->fileid-=1;p=p->next;}returnflag;}p=f;f=f->next;while(f){if(strcmp(filename,fil[f->fdtblockindex].filename)==0){flag=1;p=f->next; /*p=p->next;*/while(p){p=p->next;p->fileid-=1;}free(f);returnflag;}p=f;f=f->next;}if(flag==0){printf("Thisfilehasnotopen!\n'");returnflag;}return0;}intFREAD(char*str,intn,intfileid)/*文件块读*/{intm,i,j=0,k,l,len;chara[3];structFCBBlock*p;p=fcb;while(p){if(p->fileid==fileid)break;elsep=p->next;}len=fil[p->fdtblockindex].filelen;/*文件长度*/l=p->filepos;/*文件读写指针:该块在文件的相对位置*/printf("nowfileposis:");printf("%d\n",l);printf("iswritingasnowfilepos?(y/n):");scanf("%s",a);if(a[0]=='n'||a[0]=='N'){printf("inputpos:");while(1){scanf("%d",&l);if(fil[p->fdtblockindex].filelen<(l+n))/*?*/printf("toolarge!\ninputagain:");elsebreak;}}while(1){if(n>fil[p->fdtblockindex].filelen){printf("toolarge!\n");printf("inputreadsize,again:");scanf("%d",&n);}elsebreak;}str=(char*)malloc(fil[p->fdtblockindex].filelen+1);m=(len/BlockSize)+(len%BlockSize?1:0);k=fil[p->fdtblockindex].firstblockaddr;if(m>1){fseek(fp,(k-1)*BlockSize,0);fread(str,BlockSize,1,fp);k=fat1[k-1];for(i=1;i<(m-1);i++){fseek(fp,fat1[k-1]*BlockSize,0);fread(&str[i*BlockSize],BlockSize,1,fp);k=fat1[k-1];}fseek(fp,(k-1)*BlockSize,0);fread(&str[i*BlockSize],len-i*BlockSize,1,fp);}else{fseek(fp,(k-1)*BlockSize,0);fread(str,len,1,fp);}str[n+l]='\0';if(l!=0)str=&str[l];p->filepos=n+l;printf("%s\n",str);return1;}voidFWRITE(char*ptr,intn,intfileid){chara[3];longl;intm,i=0,j,k=0,num,flag=0,flag1=0,b;structFCBBlock*p;p=fcb;while(p){if(p->fileid==fileid)break;elsep=p->next;}l=p->filepos;printf("nowfileposis:");printf("%d\n",l);printf("iswritingasnowfilepos?(y/n):");scanf("%s",a);if(a[0]=='n'||a[0]=='N'){printf("inputpos:");while(1){scanf("%d",&l);if(fil[p->fdtblockindex].filelen<(l+n))printf("toolarge!\ninputagain:");elsebreak;}}j=(l/BlockSize)+(l%BlockSize?1:0);if(l==0)j=1;num=fil[p->fdtblockindex].firstblockaddr;for(i=1;i<j;i++)num=fat1[num];do{if(flag==0){fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0);flag=1;}else{fseek(fp,(num-1)*BlockSize,0);num=fat1[num-1];}if(((n+l)-(i-1)*BlockSize)>BlockSize){if(flag1==0){fwrite(&ptr[0],j*BlockSize-l,1,fp);flag1=1;}else{fwrite(&ptr[j*BlockSize-l+k*BlockSize],BlockSize,1,fp);}}else{m=j*BlockSize-l+(k-1)*BlockSize;b=n-(j*BlockSize-l+(k-1)*BlockSize);fwrite(&ptr[m],b,1,fp);}k++;i++;}while(((n+l)-(i-1)*BlockSize)>1);p->filepos=l+n;}intFEOF(intfileid){intflag;structFCBBlock*p;p=fcb;while(p){if(p->fileid==fileid)break;}if(p->filepos>fil[p->fdtblockindex].filelen)return0;elsereturn1;}longFGETPOS(intfileid){structFCBBlock*p;p=fcb;while(p){if(p->fileid==fileid)return(p->filepos);elsep=p->next;}printf("getfaile!\n");return(0);}intFSETPOS(intfileid,longoffset){structFCBBlock*p;p=fcb;while(p){if(p->fileid==fileid){while(offset>fil[p->fdtblockindex].filelen||offset<0){printf("seterror!Thispos>filelength\n");printf("inputfilepos,again:");scanf("%d",offset);}p->filepos=offset;return1;}elsep=p->next;}printf("getfaile!\n");return(0);}voidDISPLAY(){printf("\t\tpleaseinputyouorder:\n");printf("\t\t建立文件:creat\n");printf("\t\t显示目录:list\n");printf("\t\t删除文件:del\n");printf("\t\t翻开文件:open\n");printf("\t\t关闭文件:close\n");printf("\t\t文件块读:read\n");printf("\t\t文件块写:write\n");printf("\t\t退出:exit\n");}voidtest(char*filename){char*t,cmd[10],fname[12];structFCBBlock*p;inti,j,n,flag,len,id,flag1=0;fp=OPENSYS(filename);while(1){DISPLAY();scanf("%s",cmd);if(!strcmp(cmd,"creat")){printf("inputfilename\n");scanf("%s",fname);flag=FCREATE(fname);if(flag==1)printf("Thisfilecreatesuccessfully!\n");}elseif(!strcmp(cmd,"list"))LISTDIR();elseif(!strcmp(cmd,"del")){scanf("%s",fname);flag=FDELETE(fname);if(flag==1)printf("deleteThisfilesuccessfully!\n");}elseif(!strcmp(cmd,"open")){scanf("%s",fname);flag=FOPEN(fname);if(flag==1)printf("Thisfileopensuccessfully!\n");}elseif(!strcmp(cmd,"close")){scanf("%s",fname);flag=FCLOSE(fname);if(flag==1)printf("Thisfileclosesuccessfully!\n");}elseif(!strcmp(cmd,"read")){scanf("%s",fname);p=fcb;flag1=0;while(p){if(!strcmp(fil[p->fdtblockindex].filename,fname)){printf("inpputsize:");scanf("%d",&len);id=p->fileid;flag=FREAD(str,len,id);flag1=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论