《2022年操作系统课程设计计算机级》由会员分享,可在线阅读,更多相关《2022年操作系统课程设计计算机级(23页珍藏版)》请在金锄头文库上搜索。
1、课 程 设 计 报 告课程名称操作系统课程设计课题名称索引文件系统专业计算机科学与技术班级计算机 1001 学号姓名指导教师周 铁 山名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 23 页 - - - - - - - - - 2013 年 1 月 3 日湖南工程学院课 程 设 计 任 务 书课程名称操作系统课程设计课题索引文件系统专业班级计 1001 算机学生姓名学号指导老师周铁山审批周铁山名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
2、 - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 23 页 - - - - - - - - - 任务书下达日期2013 年 1 月 2 日任 务 完 成 日 期2013 年 1 月 5 日目录名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 23 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
3、- - 第 4 页,共 23 页 - - - - - - - - - 计算机 10 级操作系统课程设计任务书一、课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。二、设计课题课题一:模拟实现单级目录的FAT文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。基本设计要求:1、实现如下文件系统功能(过程或函数):a、 挂载文件系统FILE *OPENSYS(char *); b、 卸载文件系统i
4、nt CLOSESYS(FILE *stream); c、 显示目录void LISTDIR(void); d、 建立文件int FCREA TE(char *); e、 删除文件int FDELETE(char *); f、 打开文件int FOPEN(char *); 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、 获
5、取文件指针long FGETPOS(int fileid); l、 设置文件指针int FSETPOS(int fileid, long offset); m、 取得文件长度long FGETLEN(char *); 2、提供文件系统创建程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。文件系统空间划分:保留扇区FAT 表区(或字节映像图区)根目录区文件分区可以使用的C 语言文件操纵函数:FILE *fopen(const char *, const char *mode); int fclose(FILE *stream); int fseek(FILE *stream, lo
6、ng offset, int whence); long ftell(FILE *stream); size_t fread(void *ptr, size_t size, size_t n, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream); 课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。三、课程设计报告要求1、 设计报告要求A4纸打印成册;2、 使用学院统一的封面;名师资料总结 - - -精品资料欢迎下载 -
7、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 23 页 - - - - - - - - - 3、 课程设计报告每人一份,必须包含如下几个方面的内容:1)基本设计思想;2)主要数据结构;3)主要实施流程;4)所有源代码;5)课程设计总结与体会。四、分组及选题办法1、 按学号顺序一人一组,学号为奇数者为课题一,偶数者为课题二。2、 成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。五、设计进度安排1、 讲课及上机调试时间安排:上课时间:上机时间:2、 其余时间:查阅资料,确定方案,设计课题相关程序。
8、3、 个人答辩,交课程设计报告。主要数据结构提示:1、单级目录 FAT 文件系统:1)常量#define BlockSize 512 #define DirSize 32 2)保留扇区结构struct ReserveBlock int sysblocknum; /*文件系统总扇区数 */ int resblocknum; /* 保留扇区扇区数 */ int fatblocknum; /*FAT 表扇区数 */ int rootblocknum; /*根目录区扇区数 */ char fillcharBlockSize-4*sizeof(int);/* 填充字节 */ ; 3)目录结构struct
9、 DirBlock char 11; /*文件名限长 11个字符 */ char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /* 填充字节 */ long ; /*文件长度 */ int year,month,day; /* 日期*/ int firstblockaddr; /*文件首块扇区号 */ ; 4)FCB(文件控制块)结构struct FCBBlock int fileid; /*文件标识 */ struct DirBlock ; /* 目录信息 */ long ; /* 文件读写指针 */ int fdtblockaddr
10、; /*目录项所在块号 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 23 页 - - - - - - - - - int fdtblockindex; /* 目录项所在块内序号 */ struct FCBBlock *next; /*指向下一个文件控制块的指针*/ ; 2、单级目录单级索引文件系统:1)常量#define BlockSize 512 #define DirSize 32 2)保留扇区结构struct ReserveBlock int sysblo
11、cknum; /*文件系统总扇区数 */ int resblocknum; /* 保留扇区扇区数 */ int mapblocknum; /*字节映像图扇区数 */ int rootblocknum; /*根目录区扇区数 */ char fillcharBlockSize-4*sizeof(int); /* 填充字节 */ ; 3)目录结构struct DirBlock char 11; /*文件名限长 11个字符 */ char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字节 */ long ; /*文件长度 */ int
12、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 *nextnode; /*指向下一索引节
13、点的指针*/ ; 6)FCB(文件控制块)结构struct FCBBlock int fileid; /*文件标识 */ struct DirBlock ; /*目录信息 */ long ; /*文件读写指针 */ int fdtblockaddr; /*目录项所在块号 */ int fdtblockindex; /* 目录项所在块内序号 */ struct FCBBlock *next; /*指向下一个文件控制块的指针*/ struct IndexNode *firstindexnode; /*指向第一个索引节点的指针*/ ; 名师资料总结 - - -精品资料欢迎下载 - - - - - -
14、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 23 页 - - - - - - - - - 一实验目的:操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、 解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。二程序功能:模拟实现单级目录、单级索引的索引文件系统,包含的功能有:文件的创建,文件删除,读,写,打开,关闭以及能显示目录。在创建文件时,系统首先为新文件分配所需的外存空间,并且在文件系统的相应目录中, 建立一个目录项,
15、该目录项纪录了新文件的文件名以及在外存中的地址等名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 23 页 - - - - - - - - - 属性。它是目录文件中的一个记录,它与文件时一一对应。当不需要某个文件时,便可以把它从文件系统中删除。 这时执行的是与创建文件相反的操作。系统先从目录中找到要删除的文件项,使之成为空项,紧接着回收该文件的存储空间,用于下次分配。通过读指针,将位于外部存储介质上的数据读入到内存缓冲区这样就实现了文件的读取,通过写指针,将内存缓冲区中的数
16、据写入到位于外部存储介质上的文件中。 在开始使用文件时, 首先必须打开文件。 这可以将文件属性信息装入内存,以便以后快速查用。在完成文件使用后,应该关闭文件。这不但是为了释放内存空间,而且也因为许多系统常常限制可以同时打开的文件数。当创建文件时, 先在目录表中查找是否存在此文件表,若存在则表示文件同名不能创建,否则在目录表中为此文件先建立一个目录项,保存文件的一些基本属性,如创建日期、大小、文件名等,并保存文件的首索引块扇区号,对文件读写也是先在目录项里查找文件是否存在, 再根据文件的首索引块扇区号, 查找对应块号中的内容对其进行读写操作,删除一个文件后回收为其分配的空间,并更新目录表、修改文
17、件控制块。显示目录项可以显示文件名、长度以及创建日期。三程序的基本设计思路:单级目录,单级索引的索引文件系统:单级目录,它是整个目录组织是一个线性结构,系统中的所有文件都建立在一张目录表中。它主要用于单用户操作系统,具有结构简单、文件多时目录检索时间长和有命名冲突等特点;文件的索引结构实际上就是把链接结构中的指针取出来集中存放在一起,这样它既能够完全利用每一个存储块的最大存储量,又保持物理块为2 的幂。索引文件系统它是指为每一文件建立一张索引表,将文件中每个记录的记录号、长度和指向该记录的指针记入索引表中的一种文件组织形式。由于索引表本身是一个定长记录文件,因此可以十分方便地检索到相应记录的索
18、引表项,从而可方便地对主文件中的记录实现直接存取。模拟实现单机目录, 单级索引的索引文件系统基本思路:用使用链接域将同一文件的各索引块按顺序连接起来。在一个文件系统中对文件进行操作,实现文件的创建、读写等等操作。在创建文件时先在目录项中进行查找, 若创建的文件已存在, 文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下, 不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功 ,而文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹中抛出。 文件夹和文件的删除, 文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,每次操
19、作成功都要更改目录和索引信息。该过程都保存在文件中,是对文件的操作。本系统建于 Windows平台,开发环境为microsoft visual C+。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 23 页 - - - - - - - - - 四程序流程图1.系统功能图2创建文件在创建文件成功后,要把新用的磁盘块连接到正确的位置,以确保文件索引结构的正确。另外,若外存磁盘块已用完,则不能再建立文件,表明文件建立的失败。Main() 文件系统界面创建文件打开文件显示目录写入
20、文件删除文件读文件文件系统退 出 文 件 系统创建文件选择文件类型输入文件夹的内容取未用磁盘来存储信息选择文件类型输入文件的信息名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 23 页 - - - - - - - - - 3.删除文件删除文件的流程与创建文件基本相同,也是先选择文件类型,然后再进行相应的操作。在删除文件中,要把该文件中所有属于该文件范围内的所占有的磁盘块都要进行“清零”处理,即释放磁盘块。4.写文件在向文件写入数据的过程中,若外存磁盘已满,则会停止向文件
21、写入数据。5.读文件读取文件内的数据较为简单。可直接从目录索引表中查找到该文件,并得到该文件所在的磁盘块号,然后读取该磁盘块里的内容,获取该文件的索引表,通过索引表来读取数据。6.打开文件打开文件可直接通过目录索引表来打开相应的文件。打开文件分为打开文件夹和打开文件两种方式。打开文件, 则显示该文件的指针 ( 文件所在的磁盘块 ) 、文件创建日期及文件大小;打开文件夹,除了显示所述信息外,还要显示该文件夹里所有的文件的信息。五调试运行:1. 进入功能菜单,选择要执行的功能,如下图一所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
22、 - 名师精心整理 - - - - - - - 第 11 页,共 23 页 - - - - - - - - - 2. 创建文件,如下图二所示:3. 写文件,如下图三所示:4. 显示文件目录,如下图四所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 23 页 - - - - - - - - - 5. 删除文件。如下图五所示:6. 退出文件系统,如图六所示:六心得体会:这次的课设给了我很大的收获, 不仅仅对计算机的知识有了进一步的了解,并且对我的实践能力提高的帮助也是相
23、当大。 刚看到课程任务书时觉得比较有难度的课程设计,但是它与以往的不同的是,功能的编码实现部分是已经提供的了,我们需要做的只是将它连接起来,首先要弄明白的是功能模块的作用, 之间改怎样联系。 其次还要了解变量之间的联系。 总的来说就是要弄懂总个程序。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 23 页 - - - - - - - - - 但脑袋里面没有一个总体的概念是很难完成的,阅览代码就要充分了解设计者的思想。一直不停的阅览分析,调试, 修修改改才完成了这次课设的
24、代码部分。这也让我明白了一个道理,读懂他人的思想并不比自己编程来的简单。在完成代码的过程中,出现了很多错误,一个一个慢慢修改。这让我体会到养成一种良好的编程习惯是非常重要的,不仅仅是变量的编写错误这些小毛病。还有不能一条一条语句编写, 首先就是要够好思路才能达到事半功倍的效果。而且代码的编写格式也非常重要,这不仅仅是美观的问题而且便于对代码理解。编程也是交流精神也是非常重要的,由于自己的惯性思维对自己的错误很难发现,所以需要别人的帮助更快更容易发现错误。代码编写过程中,同学的热心帮助,老师的细心指导是很重要的。其次,代码编写能力也是很重要的,一个文件的创建更或是输入输出都有问题的话,需要借助资
25、料, 这是很麻烦的, 最基本的功夫不到家有想法也是很难实现的。通过这次课设我学到了设计简单磁盘管理的思想,单级目录, 单级索引的文件索引系统。 重要的是培养了多多交流的精神,这简直太重要了。在课设过程中,在遇到问题的时候,同学们愿意放下自己手中的是来帮我解决,让我感到很温暖,从同学那里也学到了不少知识。总之,很感谢老师和同学的帮助。这次的课程设计已经结束了,但学习还没有结束,这次的领悟就是丰富的知识,和动手能力的培养是多么的重要。我将不断丰富自己的知识,在动手中培养自己的实际操作能力。七附录:1.源程序#define BlockSize 512 #define DirSize 32 #defi
26、ne RootSize 2 struct ReserveBlock int sysblocknum;/*文件系统总扇区数 */ int resblocknum;/*保留扇区扇区数 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 23 页 - - - - - - - - - int mapblocknum;/*字节映像图扇区数 */ int rootblocknum;/*根目录区扇区数 */ char fillcharBlockSize-4*sizeof(int);
27、/*填充字节 */ ; struct DirBlock char 11; /*文件名限长 11个字符 */ char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字节 */ long ; /*文件长度 */ int year,month,day; /*日期*/ int firstindexaddr; /*文件首索引块扇区号 */ ; struct IndexBlock int dataaddrBlockSize/sizeof(int)-1; /*数据块块号数组 */ int nextindexaddr; /*本文件下一索引块块号
28、 */ ; struct IndexNode struct IndexBlock block; /*索引块数据 */ int blockaddr; /*本节点索引块块号 */ struct IndexNode *nextnode;/*指向下一索引节点的指针*/ ; struct FCBBlock int fileid; /*文件标识 */ struct DirBlock ; /*目录信息 */ long ; /*文件读写指针 */ int fdtblockaddr; /*目录项所在块号 */ int fdtblockindex; /*目录项所在块内序号 */ struct FCBBlock *
29、next;/*指向下一个文件控制块的指针*/ struct IndexNode *firstindexnode;/*指向第一个索引节点的指针*/ ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 23 页 - - - - - - - - - #include index.h #include #include #include int main() struct ReserveBlock sys; char =indexsys.dat; char fillcharBl
30、ockSize; char *map; int i,j; FILE *fp; memset(&sys,255,BlockSize); printf(Please Input s Block Num(532767):); scanf(%d,&(sys.sysblocknum); sys.resblocknum=1; sys.mapblocknum=sys.sysblocknum/(BlockSize/sizeof(char)+/求出 FAT 表区所需的磁盘块数,即存储磁盘块的使用情况所需的磁盘块数 (sys.sysblocknum%(BlockSize/sizeof(char)?1:0); ma
31、p=(char*)malloc(BlockSize*sys.mapblocknum); memset(map,255,BlockSize*sys.mapblocknum); memset(map,0,sizeof(char)*sys.sysblocknum); sys.rootblocknum=RootSize;/根目录区分配的块数,这里固定为2 块 j=sys.resblocknum+sys.mapblocknum+sys.rootblocknum; for (i=0;ij;i+) mapi=1; /标注这些非文件存储使用区的块部分已经使用 memset(&fillchar,0,BlockS
32、ize);/用 0 填充一块, 512 字节 fp=fopen(,w+b); fwrite(&sys,1,BlockSize,fp);/文件中写入第一块进去,即为保留扇区块,其中存储磁盘的块数分配信息,即ReserveBlock 块的信息 for (i=0;isys.mapblocknum;i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 23 页 - - - - - - - - - fwrite(map+i*BlockSize/sizeof(char),1,Bl
33、ockSize,fp);/map可能有多块,每次只将一块(512B )写入文件中去;这是第二次写入,可能写入多块 j=sys.resblocknum+sys.mapblocknum; for(i=0;i(sys.sysblocknum-j);i+) fwrite(&fillchar,1,BlockSize,fp);/在文件中存入用于存放文件的块数,每次存一块,这些存入的块都将用来存放文件 fclose(fp);/关闭打开的文件 free(map);/释放为 map分配的内存空间 return 0; #include index.h #include #include #include FILE
34、 *; struct ReserveBlock sys; char *map; struct FCBBlock *fcblist; /*a 、打开文件系统 */ FILE *OPENSYS(char *) int i; FILE *fp; fp=fopen(,r+b); fread(&sys,1,BlockSize,fp);/将第一块保留扇区的内容读入内存,其中存放模拟文件系统的扇区分配信息 map=(char *)malloc(BlockSize*sys.mapblocknum); for(i=0;isys.mapblocknum;i+) fread(map+i*BlockSize/size
35、of(char),1,BlockSize,fp);/读取扇区块使用情况的扇区块的信息,这里面标记了模拟文件系统磁盘块的每块的使用状态名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 23 页 - - - - - - - - - fcblist=NULL;/置已打开文件的列表为空 return fp; /*b 、关闭文件系统 */ int CLOSESYS(FILE *stream) int i; fseek(stream,sys.resblocknum*BlockSize
36、,SEEK_SET); for(i=0;isys.mapblocknum;i+) fwrite(map+i*BlockSize/sizeof(char),1,BlockSize,stream);/将模拟文件系统的文件块使用信息重新写入磁盘 fclose(stream); free(map); return 1; /*c 、显示目录 */ void LISTDIR(void) int i,j; struct DirBlock *fdt,*fdt1; fdt1=(struct DirBlock *)malloc(BlockSize);/一个目录块占 32B,这里分配 512B,即 16 个目录的存
37、放空间 fseek(,(sys.resblocknum+sys.mapblocknum)*BlockSize,SEEK_SET);/将文件指针置于目录块的块首 printf(-n); for(i=0;isys.rootblocknum;i+) fread(fdt1,1,BlockSize,);/每次读取一块 fdt=fdt1; for(j=0;j0!=0) printf(%12s%12ld%5d-%2d-%2dn,fdt-, fdt-year,fdt-month,fdt-day); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
38、 名师精心整理 - - - - - - - 第 18 页,共 23 页 - - - - - - - - - fdt+; free(fdt1); /*d 、建立文件 */ int FCREATE(char *)/ int i,j; struct DirBlock *fdt,*fdt1; long addr; fdt1=(struct DirBlock *)malloc(BlockSize); addr=(sys.resblocknum+sys.mapblocknum)*BlockSize; fseek(); for(i=0;isys.rootblocknum;i+) fread(fdt1,1,B
39、lockSize,); fdt=fdt1; for(j=0;j)/判断要建立的文件的文件名是否已经存在 printf(Duplicate !n); free(fdt1); return 0; else fdt+; fseek(); for(i=0;isys.rootblocknum;i+)/读取根目录块数,一次读取一块 fread(fdt1,1,BlockSize,); fdt=fdt1; for(j=0;j0=0)/如果读取到空闲空间就执行加入一条文件目录操作 strcpy(fdt-);/写入文件名 fdt-; fdt-year=2003; fdt-month=3; fdt-day=12;
40、fdt-firstindexaddr=0;/设置该文件存入数据时所用到的第一个盘块号为0 fseek();/若是第一块则置文件指针到目录块首, 否则置文件指针到相应的末尾处 fwrite(fdt1,1,BlockSize,);/重新写入这一块的数据 free(fdt1); return 1; else fdt+; addr=ftell();/非第一块时设置文件指针的位置 free(fdt1); return 0; /*e 、删除文件 */ int FDELETE(char *)/ int i,j,k,m; struct DirBlock *fdt; int blocknum; struct F
41、CBBlock *p; struct IndexBlock ib; p=fcblist; while(p) /若已经打开要删除的文件,则拒绝删除 if (!strcmp(p-) return 0; else p=p-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 23 页 - - - - - - - - - fdt=(struct DirBlock *)malloc(BlockSize); blocknum=sys.resblocknum+sys.mapbl
42、ocknum; for(i=0;isys.rootblocknum;i+) fseek(*BlockSize,SEEK_SET); fread(fdt,1,BlockSize,); /从目录块中获取该文件的信息 for(j=0;j) strcpy(fdt+j)-,);/在回收区内可以直接置0 k=(fdt+j)-firstindexaddr;/获取该文件内容所用的第一块的块号 while (k) fseek(*BlockSize,SEEK_SET); fread(&ib,1,BlockSize,);/读取文件内容块的信息 mapk=0;/修改 FAT表区中该块为未用状态 k=ib.nextin
43、dexaddr; for(m=0;m(BlockSize/sizeof(int)-1);m+) mapib.dataaddrm=0; fseek(*BlockSize,SEEK_SET); fwrite(fdt,1,BlockSize,); free(fdt); return 1; blocknum+; free(fdt); return 0; /*f 、打开文件 */ int FOPEN(char *) int i,j; struct DirBlock *fdt; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
44、- - - - - - - 第 21 页,共 23 页 - - - - - - - - - int blocknum; struct FCBBlock *p; struct IndexNode *q,*r; fdt=(struct DirBlock *)malloc(BlockSize); blocknum=sys.resblocknum+sys.mapblocknum; for(i=0;isys.rootblocknum;i+) fseek(*BlockSize,SEEK_SET); fread(fdt,1,BlockSize,);/将目录块中的内容逐块读出来 for(j=0;j) p=(s
45、truct FCBBlock *)malloc(sizeof(struct FCBBlock); p-next=fcblist;/找到该文件, 就创建一个节点, 插入到 FCB链表中,采用头结点插入法 fcblist=p; if (p-next) /这里逻辑上反了, 应该是如果是第一个打开的文件就置文件标识号为0,否则 p-next-; /才是该索引节点的下一个节点的标识号加1 即为这次打开文件的标识号 else p-/若是第一个打开的文件则置文件ID 为 1 p-*(fdt+j); /*maybe need modify*/ / p-fdtblockaddr=blocknum; p-fdtb
46、lockindex=j; p-/打开一个文件,就将文件指针指向文件的开头处,逻辑上为0 if (p-)/此处判断要打开的文件是否为空 p-firstindexnode=NULL; else q=(struct IndexNode *)malloc(sizeof(struct IndexNode); p-firstindexnode=q; q-blockaddr=p-; fseek(blockaddr*BlockSize,SEEK_SET); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
47、 第 22 页,共 23 页 - - - - - - - - - fread(&q-block,1,BlockSize,); while (q-block.nextindexaddr!=0) r=q; q=(struct IndexNode *)malloc(sizeof(struct IndexNode); r-nextnode=q; q-blockaddr=r-block.nextindexaddr; fseek(blockaddr*BlockSize,SEEK_SET); fread(&q-block,1,BlockSize,); q-nextnode=NULL; free(fdt); return p-fileid; blocknum+; free(fdt); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 23 页 - - - - - - - - -