




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 设 计 报 告课程名称 操作系统 课题名称 模拟实现单级目录、单级索引的索引文件系统 专 业 计算机科学与技术 班 级 学 号 姓 名 指导教师 周铁山 2013年 月 日湖南工程学院课 程 设 计 任 务 书 课程名称 操作系统 课 题 模拟实现单级目录、单级索引的索引文件系统 专业班级 计算机1181 学生姓名 学 号 指导老师 周铁山 审 批 任务书下达日期 2013 年 月 日 任务完成日期 2013年 月 日一、 课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题
2、、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。二、 设计课题课题一:模拟实现单级目录的FAT文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。 基本设计要求:1、实现如下文件系统功能(过程或函数):a、 打开文件系统 FILE *OPENSYS(char *filename);b、 关闭文件系统 int CLOSESYS(FILE *stream);c、 显示目录 void LISTDIR(void);d、 建立文件 int FCREATE(char *filename);e、 删除文件 int FDELETE(char *filename);f、
3、 打开文件 int FOPEN(char *filename);g、 关闭文件 int FCLOSE(int fileid);h、 文件块读 int FREAD(void *ptr, int n, int fileid);i、 文件块写 int FWRITE(void *ptr, int n, int fileid);j、 判断文件结束 int FEOF(int fileid);k、 获取文件指针 long FGETPOS(int fileid);l、 设置文件指针 int FSETPOS(int fileid, long offset);m、 取得文件长度 long FGETLEN(char
4、 *filename);2、提供文件系统创建程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。文件系统空间划分:保留扇区FAT表区(或字节映像图区)根目录区文件分区可以使用的C语言文件操纵函数:FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t size, size_t n
5、, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。三、 课程设计报告要求1、 设计报告要求A4纸打印成册;2、 使用学院统一的封面;3、 课程设计报告每人一份,必须包含如下几个方面的内容:1) 基本设计思想;2) 主要数据结构;3) 主要实施流程;4) 所有源代码;5) 课程设计总结与体会。四、 分组及选题办法1、 按学号顺序一人一组,学号为奇数者为课题一,偶数者为课
6、题二。2、 成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。五、设计进度安排1、 讲课及上机调试时间安排: 上机时间:十八周 周一至周三每天上午8:0012:00 2、 其余时间:查阅资料,确定方案,设计课题相关程序。3、 个人答辩,交课程设计报告。主要数据结构提示:1、 单级目录FAT文件系统:1) 常量 #define BlockSize 512#define DirSize 322) 保留扇区结构struct ReserveBlock int sysblocknum; /*文件系统总扇区数*/ int resblocknum; /*保留扇区扇区数*/ int fat
7、blocknum; /*FAT表扇区数*/ int rootblocknum; /*根目录区扇区数*/ char fillcharBlockSize-4*sizeof(int);/*填充字节*/;3) 目录结构 struct DirBlock char filename11; /*文件名限长11个字符*/char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字节*/ long filelen; /*文件长度*/ int year,month,day; /*日期*/ int firstblockaddr; /*文件首块扇区号*/;
8、 4) FCB(文件控制块)结构struct FCBBlock int fileid; /*文件标识*/ struct DirBlock fileinfo; /*目录信息*/ long filepos; /*文件读写指针*/ int fdtblockaddr; /*目录项所在块号*/ int fdtblockindex; /*目录项所在块内序号*/ struct FCBBlock *next;/*指向下一个文件控制块的指针*/;2、 单级目录单级索引文件系统:1) 常量 #define BlockSize 512#define DirSize 322) 保留扇区结构struct Reserve
9、Block int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/ int mapblocknum; /*字节映像图扇区数*/ int rootblocknum; /*根目录区扇区数*/ char fillcharBlockSize-4*sizeof(int); /*填充字节*/;3) 目录结构 struct DirBlock char filename11; /*文件名限长11个字符*/char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字节*/ long file
10、len; /*文件长度*/ int year,month,day; /*日期*/ int firstindexaddr; /*文件首索引块扇区号*/; 4) 索引块结构 struct IndexBlock int dataaddrBlockSize/sizeof(int)-1; /*数据块块号数组*/ int nextindexaddr; /*本文件下一索引块块号*/; 5) 索引节点结构 struct IndexNode struct IndexBlock block; /*索引块数据*/ int blockaddr; /*本节点索引块块号*/struct IndexNode *nextno
11、de; /*指向下一索引节点的指针*/;6) FCB(文件控制块)结构struct FCBBlock int fileid; /*文件标识*/ struct DirBlock fileinfo; /*目录信息*/ long filepos; /*文件读写指针*/ int fdtblockaddr; /*目录项所在块号*/ int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; /*指向下一个文件控制块的指针*/ struct IndexNode *firstindexnode; /*指向第一个索引节点的指针*/;目录一、程序的功能1二、程序
12、的基本设计思路1三、主要的数据结构1四、主要实施流程2五、程序调试及其运行结果4六、设计总结与心得体会5七、附录(源程序清单)7 湖南工程学院课程设计报告 一、程序的功能 该程序主要模拟实现单级目录、单级索引的索引文件系统,该系统要求能打开文件系统;关闭文件系统;显示目录;建立文件;删除文件;打开文件;关闭文件;文件块读;文件块写;判断文件结束;获取文件指针;设置文件指针;取得文件长度等功能。要求使用链接域将同一文件的各索引块按顺序连接起来。二、程序的基本设计思路 模拟实现单级目录、单级索引的索引文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。在一个文件系统中对文件
13、进行操作,实现文件的创建、读写等等操作。在创建文件时先在目录项中进行查找,若创建的文件已存在,文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,而文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出。文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,每次操作成功都要更改目录和FCB信息。该过程都保存在文件中,是对文件的操作。本系统建于Windows平台,开发环境为WIN-TC。三、主要的数据结构1.常量#define BlockSiz
14、e 512#define DirSize 322.保留扇区结构struct ReserveBlockint sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int mapblocknum; /*字节映像图扇区数*/int rootblocknum; /*根目录区扇区数*/char fillcharBlockSize-4*sizeof(int); /*填充字节*/;3.目录结构struct DirBlockchar filename11; /*文件名限长11个字符*/char fillcharDirSize-4*sizeof(int)-s
15、izeof(long int)-11; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*定义年月日*/int firstindexaddr; /*文件首索引块扇区号*/; 4.索引块结构struct IndexBlockint dataaddrBlockSize/sizeof(int)-1; /*数据块块号数组*/int nextindexaddr; /*本文件下一索引块块号*/; 5.索引节点结构 struct IndexNodestruct IndexBlock block; /*索引块数据*/int blockaddr; /*本节点
16、索引块块号*/struct IndexNode *nextnode; /*指向下一索引节点的指针*/;6.FCB(文件控制块)结构struct FCBBlockint fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; /*指向下一个文件控制块的指针*/ struct IndexNode *firstindexnode; /*指向第一
17、个索引节点的指针* /四、主要实施流程用到的某些函数流程图 图一、FCLOSE函数 图二、FCREATE 函数 图三、FDELETE函数 图四、OPENSYS 函数五、 程序调试及其运行结果 下面是程序调试时的一些截图。 图五、输入扇区块数 图六、 成功创建文件 图七、未打开文件,不能进行写操作 图八、 成功删除文件 图九、文件删 之后不能打开,显示不能找到文件六、设计总结与心得体会这次课程设计对我们来说很重要,从中我也是收益很多。也有很多感受。 第一,通过这次C语言程序设计,让我更深地体会到了上机操作有助于将书本上的知识系统化、现实化,更加锻炼了我自己的查漏补缺的能力。
18、书本上的知识永远是死的,只有将其运用到实际的生活中才会变成活的,而课设恰好给了我们这样一个机会。 第二,课程设计是一个综合性的课程,不仅能检测我们的学习这门课的熟练程度,还能让我们温习课程,达到复习和巩固的效果,在课程设计的过程中我们不断地遇到问题,不断的在图书馆和网上、书本上查找资料,不断的向老师、同学请教问题,所以慢慢的解决问题,而这就是一个不断提升自己的过程。课程设计也教会了我们怎么样利用自己身边有的资源,如书本、网络、老师和同学,怎样和同学互相学习、互相帮助、互相合作。 总的来说,此次课程设计算是个较为完整的程序,将学到过的知识巩固,吃透。尤其是答辩的时候,老师问的
19、问题更加是考验你的基础,当你掌握的很好的时候,将知识融会贯通的时候,回答问题当然容易。当然我没有很好掌握,所以没有回答出老师的问题。这也是我得到的一笔财富:知识并不是仅仅从课堂上学到的就够了,课堂上的知识仅仅只是一个引导作用七、附录源程序代码#include <stdio.h>#include <string.h>#include <stdlib.h>#define BlockSize 512#define DirSize 32#define RootSize 2struct ReserveBlock int sysblocknum;/*文件系统总扇区数*/
20、 int resblocknum;/*保留扇区扇区数*/ int fatblocknum;/*FAT表扇区数*/ int rootblocknum;/*根目录区扇区数*/ char fillcharBlockSize-4*sizeof(int);/*填充字节*/;struct DirBlock char filename11; /*文件名限长11个字符*/ char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字节*/ long filelen; /*文件长度*/ int year,month,day; /*日期*/ int f
21、irstblockaddr; /*文件首块扇区号*/;struct FCBBlock int fileid; /*文件标识*/ struct DirBlock fileinfo; /*目录信息*/ long filepos; /*文件读写指针*/ int fdtblockaddr; /*目录项所在块号*/ int fdtblockindex; /*目录项所在块内序号*/ struct FCBBlock *next;/*指向下一个文件控制块的指针*/;struct ReserveBlock sys1;struct FCBBlock *fcb;struct DirBlock fil32,*dir;
22、/*目录项*/int *fat1;char *str,*ptr;char fillcharBlockSize;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<sys1.fatblocknum;i+) fread(fat1,sizeof(int)*sys1.sysblocknum,1,fp);/*把基本文件系统都读进
23、来*/ 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,stream); fseek(fp,(sys1.fatblocknum+sys1.resblocknu
24、m)*BlockSize,0); fwrite(dir,DirSize*32,1,fp); fclose(fp); return 1;void LISTDIR(void)/*显示目录*/ int i,flag=0; for(i=0;i<32;i+) if(fili.firstblockaddr!=0) if(flag=0) printf("filename n"); flag=1; /*标示*/ printf("%sn",fili.filename); int FCREATE(char *filename)/*建立文件*/ int i,flag=0
25、,j,k=0,flag1=0,flag2=0,a; int n,m; while(1) a=strlen(filename);/*文件名长度*/ if(a>10) printf("This file length too long!n"); printf("input file name again:"); scanf("%s",filename); else break; while(1) for(i=0;i<32;i+) if(strcmp(filename,fili.filename)=0) printf("
26、;the name already exist n"); printf("input name again:"); 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(fat1i=0) flag+;/*统计磁盘上为空数目*/ if(flag=0) printf("ci pan yi
27、 man");/*统计结果为0,则磁盘已满*/ return 0; printf("kong xian kuai shu:%dn",flag); printf("input file length:"); for(j=0;j<32;j+) if(filj.firstblockaddr=0) break; while(1) scanf("%d",&dirj.filelen);/*输入目录项中文件的长度*/ n=(dirj.filelen/BlockSize)+(dirj.filelen%BlockSize?1:0
28、); if(n<0|n>flag)/*文件长度小于0或大于空闲的空间 */ printf("input length too long!n"); printf("input again:"); else break; for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+)/*文件内容区域*/ if(fat1i=0) k+; if(flag2=0) dirj.firstblockaddr=i+1; flag2=1; else if
29、(k>=n)/*n 文件长度*/ fat1m=i+1; fat1i=-1; break; else fat1m=i+1; m=i; strcpy(dirj.filename,filename); dirj.filenamea='0' printf("input year:"); scanf("%d",&dirj.year); printf("input month:"); scanf("%d",&dirj.month); printf("input day:"
30、;); scanf("%d",&dirj.day); return (1);int FDELETE(char *filename)/*删除文件 */int i,j,k,n,flag=0; struct FCBBlock *p;/*文件控制块指针*/ p=fcb; while(p)if(strcmp(filename,filp->fdtblockindex.filename)=0)/*目录项所在序号 */ printf("the file has open,please close it before delete !n"); return
31、0; else p=p->next; for(i=0;i<32;i+)/*查找要关闭的文件 */ if(strcmp(filename,fili.filename)=0) flag=1; break; if(flag=0)printf("file cannot find!n");return 0;j=fili.firstblockaddr;while(1) k=fat1j-1; fseek(fp,(j-1)*BlockSize,0);/*将指针指向文件的第一个扇区的位置 */ fwrite(&fillchar,1,BlockSize,fp); fat1j
32、-1=0; if(k=-1) break; else j=k;memset(&fili,0,DirSize);return 1;int FOPEN(char *filename)/*打开文件*/ int i,j=0,k,flag=0; struct FCBBlock *p,*q,*r; p=fcb; for(i=0;i<32;i+) if(strcmp(filename,fili.filename)=0)/*找到要打开的文件*/ flag=1; break; if(flag=0) printf("file cannot find!n"); return 0;
33、while(p) j+; if(strcmp(filename,filp->fdtblockindex.filename)=0) printf("This file has open!n"); return 0; q=p; p=p->next; if(fcb=NULL) fcb=(struct FCBBlock *)malloc(sizeof(struct FCBBlock); fcb->fileid=j+1;/*文件标示*/ fcb->filepos=0;/*文件读写指针 */ fcb->next=NULL;/*指向下一个文件控制指针 */
34、fcb->fdtblockindex=i; else r=(struct FCBBlock *)malloc(sizeof(struct FCBBlock); r->fileid=j+1; r->filepos=0; r->next=NULL; r->fdtblockindex=i; q->next=r; /*f->next=NULL; */ return 1;long FGETLEN(int fileid)/*获取文件指针 */ struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid)/*
35、寻找要找的指针*/ return(p->filepos); p=p->next; printf("get faile!n"); return(0);int FCLOSE(char *filename)/*关闭文件 */ int flag=0; struct FCBBlock *f,*p; f=fcb; if(strcmp(filename,filfcb->fdtblockindex.filename)=0) flag=1; fcb=fcb->next; p=fcb; while(p) p->fileid-=1; p=p->next; re
36、turn flag; p=f; f=f->next; while(f) if(strcmp(filename,filf->fdtblockindex.filename)=0) flag=1; p=f->next; /*p=p->next;*/ while(p) p=p->next; p->fileid-=1; free(f); return flag; p=f; f=f->next; if(flag=0) printf("This file has not open!n'"); return flag; return 0;i
37、nt FREAD(char *str, int n, int fileid)/*文件块读*/ int m,i,j=0,k,l,len; char a3; struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) break; else p=p->next; len=filp->fdtblockindex.filelen;/*文件长度*/ l=p->filepos;/*文件读写指针:该块在文件的相对位置*/ printf("now file pos is:"); printf("%dn&
38、quot;,l); printf("is writing as now file pos?(y/n):"); scanf("%s",a); if(a0='n'|a0='N') printf("input pos:"); while(1) scanf("%d",&l); if(filp->fdtblockindex.filelen<(l+n)/*? */ printf("too large!ninput again:"); else break;
39、 while(1) if(n>filp->fdtblockindex.filelen) printf("too large!n"); printf("input read size,again:"); scanf("%d",&n); else break; str=(char *)malloc(filp->fdtblockindex.filelen+1); m=(len/BlockSize)+(len%BlockSize?1:0); k=filp->fdtblockindex.firstblockadd
40、r; if(m>1) fseek(fp,(k-1)*BlockSize,0); fread(str,BlockSize,1,fp); k=fat1k-1; for(i=1;i<(m-1);i+) fseek(fp,fat1k-1*BlockSize,0); fread(&stri*BlockSize,BlockSize,1,fp); k=fat1k-1; fseek(fp,(k-1)*BlockSize,0); fread(&stri*BlockSize,len-i*BlockSize,1,fp); else fseek(fp,(k-1)*BlockSize,0);
41、 fread(str,len,1,fp); strn+l='0' if(l!=0) str=&strl; p->filepos=n+l; printf("%sn",str); return 1; void FWRITE(char *ptr, int n, int fileid) char a3; long l; int m,i=0,j,k=0,num,flag=0,flag1=0,b; struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) break; else p=p->
42、next; l=p->filepos; printf("now file pos is:"); printf("%dn",l); printf("is writing as now file pos?(y/n):"); scanf("%s",a); if(a0='n'|a0='N') printf("input pos:"); while(1) scanf("%d",&l); if(filp->fdtblockindex.f
43、ilelen<(l+n) printf("too large!ninput again:"); else break; j=(l/BlockSize)+(l%BlockSize?1:0); if(l=0) j=1; num=filp->fdtblockindex.firstblockaddr; for(i=1;i<j;i+) num=fat1num; do if(flag=0) fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0); flag=1; else fseek(fp,(num-1)*BlockSize,0
44、); num=fat1num-1; if(n+l)-(i-1)*BlockSize)>BlockSize ) if(flag1=0) fwrite(&ptr0,j*BlockSize-l,1,fp); flag1=1; else fwrite(&ptrj*BlockSize-l+k*BlockSize,BlockSize,1,fp); else m=j*BlockSize-l+(k-1)*BlockSize; b=n-(j*BlockSize-l+(k-1)*BlockSize); fwrite(&ptrm,b,1,fp); k+; i+; while(n+l)-
45、(i-1)*BlockSize)>1); p->filepos=l+n;int FEOF(int fileid) int flag; struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) break; if(p->filepos>filp->fdtblockindex.filelen) return 0; else return 1;long FGETPOS(int fileid)struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid)
46、return (p->filepos); else p=p->next; printf("get faile!n"); return(0);int FSETPOS(int fileid, long offset)struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) while(offset>filp->fdtblockindex.filelen|offset<0) printf("set error!This pos >file lengthn"); p
47、rintf("input file pos ,again:"); scanf("%d",offset); p->filepos=offset; return 1; else p=p->next; printf("get faile!n"); return(0);void DISPLAY() printf("tt please input you order:n"); printf("tt 建立文件:creatn"); printf("tt 显示目录:listn"); printf("tt 删除文件:deln"); printf("tt 打开文件:openn"); prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年T305型氧化锌脱硫剂项目合作计划书
- 2025年声学悬浮物监测仪项目建议书
- 2025年金属制日用杂品合作协议书
- 专题05 有关金属活动性的探究-中考化学实验题型训练
- 劳务网签合同范本
- 2025年横包卷烟机组项目合作计划书
- 农村别墅设计装修合同范例
- 销售心态建设培训
- (高清版)DB5101∕T 81-2020 地理标志产品 新民场生菜
- 费用报销付款流程
- 基于核心素养的高中数学“教、学、评”一致性研究
- GB/T 44768-2024配电网线损理论计算导则
- 体育运动中的交流与合作 课件 2024-2025学年人教版(2024)初中体育与健康七年级全一册
- 小学科学湘科版六年级下册全册同步练习含答案
- 大班科学《灯的故事》PPT优质课件
- T∕CGMA 033002-2020 压缩空气站节能设计指南
- 土建工程监理实施细则(完整版)
- 诗词接龙(飞花令)PPT
- (完整word版)苏教版初一下册英语单词
- 床旁血液滤过
- “挑战杯”优秀组织奖申报汇报材料
评论
0/150
提交评论