单用户文件系统_第1页
单用户文件系统_第2页
单用户文件系统_第3页
单用户文件系统_第4页
单用户文件系统_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计说明书题目: 单用户文件系统 院 系: 计算机科学与工程 专业班级: 信息安全1班 学 号: 2012303109 学生姓名: 蔡柳杰 指导教师: 许家昌 2014年 12月 9 日 安徽理工大学课程设计(论文)任务书 计算机 院系 计算机 教研室学 号2012303109学生姓名蔡柳杰专业(班级)信息安全12-1设计题目单用户多级文件系统设计设计技术参数(1)系统实现的功能;(2)首先在内存中创建一个数组,用来申请位示图的空间设计要求(1)了解系统实现的功能,设计较好看的界面。(2)通过代码程序实验其功能。(3)检查系统功能的实现。工作量 要求设计说明书的字数在3000字以上。工作计

2、划2012.12.06-12.12 根据课程设计的要求,查找相关资料,完成需求分析;2012.12.13-12.15 进行系统的概要设计;2012.12.16-12.31 进行系统的详细设计和源代码的书写;2013.01.01-01.11 对系统进行调试分析,写出课程设计报告。参考资料1 龚沛曾等编.C/C+程序设计教程.北京:高等教育出版社,2004.2 谭浩强编著.C程序设计(第二版).北京:清华大学出版社,1999.3 张尧学等编著.计算机操作系统教程.北京:清华大学出版社,2011.4 孟庆昌等编. 操作系统. 北京:电子工业出版社,2009.5 刘腾红等编著. 操作系统. 北京:中国

3、铁道出版社,2008.6 汤子瀛等编著. 计算机操作系统.西安:西安电子科技大学出版社,2011指导教师签字教研室主任签字2014年12月9日指导教师评语:成绩: 指导教师: 年 月 日安徽理工大学课程设计(论文)成绩评定表目录1.需求分析12.概要设计23.详细设计34.运行结果65.总结8参考文献9附录:101.需求分析 本次设计的单用户多级文件系统可通过用户输入相应的指令执行所要执行的操作,操作执行之前系统将为其申请一定的空间,并且指定起始地址。本系统用户可实现对目录和文件的创建,删除,修改等操作,还可显示目录及其文件的基本内容。我们用VC+来模拟文件系统,通过命令行的方式,实现单个用户

4、、多级文件系统。单用户多级文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。2.概要设计本系统需要实现对文件和目录的新建,删除,重命名,还需要实现文件和目录信息的显示(及查询)以及对目录的修改等功能

5、。本系统采用采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式,每次调用系统文件时,先为其申请一定的内存空间,并将其划分成目录区和文件区。创建文件、打开文件、关闭文件等函数都是使用文件名作为函数的参数对其进行调用。3.详细设计执行选择的函数结束开始定义各个变量给文件系统分配地址空间格式化调用enter(),show(),print() 函数将命令保存在code数组中选择文件系统操作类型是否已格式化(1) 主函数程序流程图否是(2) 进入文件的流程图fp=fopen("disk.dat","rb")=NULL?为文件系统申请空间开始输出出错提

6、示把磁盘文件disk.dat 读入虚拟磁盘空间找到FAT表地址和根目录地址结束初始化用户打开表(3)主界面的设计 设计界面的主界面,其中包括对文件以及目录的操作,对文件的创建,删除,打开,关闭以及文件的读写,对目录的创建,删除,显示以及更改。4.运行结果(1).用户创建目录abc并在目录abc中创建文件yonghu,并对文件abc进行读写操作等操作。运行结果截图如图1所示:图1 运行结果截图(2).完成对目录路径的更改以及删除文件abc和目录yonghu等操作,并显示出目录yonghu的内容。运行结果截图如图2所示:图2 运行结果截图5.总结通过本次操作系统的课程设计,使我认识到了自身基础知识

7、的不足,对于很多基础的知识理解不清楚,有时甚至完全不知所措,不知从何动手,经过老师的知道和同学的帮忙,设计慢慢取得了一定的进展。本次设计采用的是C语言,由于长时间没有使用到这个语言,加上平常自己也疏于对这些知识的巩固复习,所以在设计过程中很多细节没有顾全到位,以至在调试的时候感到十分吃力,编译很难通过,在这个环节上花掉了大量的时间。其次由于自己对本次设计的原理掌握不是很清楚,在设计一开始就不知所措,完全不知如何动手,经过老师的指导,逐步理解其原理,设计才施展。在设计前期对本设计的系统进行需求分析的时候,由于缺乏经验,在做需求分析的时候很多方面考虑不到位,只对其功能需求做了简要的分析,其余的都没

8、有涉及到,这也体现出了自身知识的不足。通过为期两个星期的学习,填补了很多知识的不足和空白,加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力,基本能够达到开设本次课程设计的目的,同时进一步加强了自己的实践动手能力,对今后的学习和工作都将起到很好的作用,为今后的实践奠定了很好的基础,积累了很多重要的经验。参考文献1 龚沛曾等编.C/C+程序设计教程.北京:高等教育出版社,2004。2 谭浩强编著.C程序设计(第二版).北京:清华大学出版社,1999。3 张尧学等编著.计算机操作系统教程.北京:清华大学出版社,201

9、1。4 孟庆昌等编. 操作系统. 北京:电子工业出版社,2009。5 刘腾红等编著. 操作系统. 北京:中国铁道出版社,2008。6 汤子瀛等编著. 计算机操作系统.西安:西安电子科技大学出版社,2011。附录:#include<stdio.h>#include<string.h>#include<stdlib.h>#define DIR_LENGTH 1024 /*路径最长可达100字节*/#define MAX_WRITE 1024*128 /*写入文字可达128k字节*/ #define MEM_D_SIZE 1024*1024 /*1M磁盘空间*/#

10、define DISKSIZE 1024 /*磁盘快的大小 1K*/#define MSD 5 /*最大子目录数 5 (类似五叉树)*/#define DISK_NUM MEM_D_SIZE/DISKSIZE /*磁盘快数目 1024=1M/1K*/#define FATSIZE DISK_NUM*sizeof(struct fatitem) /*FAT表大小 8K=8192B (理想应该是 1.5K)*/#define MOFN 5 /*最大文件打开数 5 (即除根以外最大深度为5)*/#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /*根目录起始盘快号 9*

11、/#define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/ /*-FAT表项结构-*/struct fatitem /* size 8*/int item; /*存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位 0 空闲*/;/*-目录项结构-*/struct direct /* size 196*/*-文件控制块信息-*/struct FCBchar name9; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数(原注释

12、位盘块数)*/int firstdisk; /*文件/目录 起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/directitemMSD+2;/*-文件打开表项结构-*/struct opentable /* size 104*/struct openttableitem /* size 20*/char name9; /*文件名*/int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/openitemMOFN;int cur_size; /*当前打文件的数目*/;/*-*/struct fatite

13、m *fat; /*FAT表*/struct direct *root; /*根目录*/struct direct *cur_dir; /*当前目录*/struct opentable u_opentable; /*文件打开表*/int fd=-1; /*文件打开表的序号*/char *bufferdir; /*记录当前路径的名称*/char *fdisk; /*虚拟磁盘起始地址*/void initfile();void format();void enter();void exit();int create(char *name);int open(char *name);int clos

14、e(char *name);int write(int fd,char *buf,int len);int read(int fd,char *buf);int del(char *name);int mkdir(char *name);int rmdir(char *name);void dir();int cd(char *name);void print();void show();/*-*/*-初始化文件系统-*/void initfile()fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /*申请 1M空间*/format();free

15、(fdisk);/*-*/*-格式化-*/void format()int i;FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址(为什么向后偏移 1k)*/*-初始化FAT表-*/fat0.item=-1; /*引导块*/fat0.em_disk='1'for(i=1;i<ROOT_DISK_NO-1;i+) /*存放 FAT表的磁盘块号*/fati.item=i+1;fati.em_disk='1' fatROOT_DISK_NO-1.item=-1;fatROOT_DISK_NO

16、-1.em_disk='1'fatROOT_DISK_NO.item=-1; /*存放根目录的磁盘块号*/fatROOT_DISK_NO.em_disk='1'for(i=ROOT_DISK_NO+1;i<DISK_NUM;i+)fati.item = -1;fati.em_disk = '0' /*-*/root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/*初始化目录*/*-指向当前目录的目录项-*/root->directitem0.sign = 1;root-&

17、gt;directitem0.firstdisk = ROOT_DISK_NO;strcpy(root->,".");root->directitem0.next = root->directitem0.firstdisk;root->perty = '1'root->directitem0.size = ROOT_DISK_SIZE;/*-指向上一级目录的目录项-*/root->directitem1.sign = 1;root->directitem1

18、.firstdisk = ROOT_DISK_NO;strcpy(root->,".");root->directitem1.next = root->directitem0.firstdisk;root->perty = '1'root->directitem1.size = ROOT_DISK_SIZE;for(i=2;i<MSD+2;i+) /*-子目录初始化为空-*/root->directitemi.sign = 0;root->direc

19、titemi.firstdisk = -1;strcpy(root->,"");root->directitemi.next = -1;root->perty = '0'root->directitemi.size = 0; if(fp = fopen("disk.dat","wb")=NULL)printf("Error:n Cannot open file n");return;if(fwrite(fdisk,

20、MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/ printf("Error:n File write error! n");fclose(fp);/*-*/*-进入文件系统-*/void enter()FILE *fp;int i;fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /*申请 1M空间*/if(fp=fopen("disk.dat","rb")=NULL)printf("Error:nCannot open filen")

21、;return; if(!fread(fdisk,MEM_D_SIZE,1,fp) /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/ printf("Error:nCannot read filen");exit(0); fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/fclose(fp);/*-初始化用户打开表-*/for(i=0;i<MOFN;i+)strcpy(u_open

22、,"");u_opentable.openitemi.firstdisk = -1;u_opentable.openitemi.size = 0; u_opentable.cur_size = 0;cur_dir = root; /*当前目录为根目录*/bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char);strcpy(bufferdir,"Root:"); /*显示根目录为E:*/ /*-*/*-退出文件系统-*/void exit()FILE *fp;int i;

23、if(fp=fopen("disk.dat","wb")=NULL)printf("Error:nCannot open filen");return; if(!fwrite(fdisk,MEM_D_SIZE,1,fp) /*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */printf("Error:nFile write error!n");fclose(fp);free(fdisk);free(bufferdir);for(i=0;i<MOFN;i+) /*撤销用户打开表 (好像没有必要,系统

24、自动会回收)*/strcpy(u_,"");u_opentable.openitemi.firstdisk = 0;u_opentable.openitemi.size = 0; u_opentable.cur_size = 0; /*用户打开文件数清零*/return;/*-*/*-创建文件-*/int create(char *name) int i,j; if(strlen(name)>8) /*文件名大于 8位*/return(-1); for(i=2;i<MSD+2;i+) /*找到第一个空闲子目录*/

25、if(cur_dir->directitemi.firstdisk=-1)break; for(j=2;j<MSD+2;j+) /*检查创建文件是否与已存在的文件重名*/ if(!strcmp(cur_dir->,name)break; if(i>=MSD+2) /*无空目录项*/return(-2); if(u_opentable.cur_size>=MOFN) /*打开文件太多(第五层)*/return(-3); if(j<MSD+2) /*文件已经存在*/return(-4); for(j=ROOT_DISK_NO+1;

26、j<DISK_NUM;j+) /*找到空闲盘块 j 后退出*/ if(fatj.em_disk='0')break; if(j>=DISK_NUM)return(-5); fatj.em_disk = '1' /*将空闲块置为已经分配*/ /*-填写目录项-*/ strcpy(cur_dir->,name); cur_dir->directitemi.firstdisk = j; cur_dir->directitemi.size = 0; cur_dir->directitemi.next =

27、 j; cur_dir->perty = '0'/*cur_dir->directitemi.sign 丢失*/ /*-*/ fd = open(name); /*打开所创建的文件*/ return 0;/*-*/*-打开文件-*/int open(char *name) int i, j; for(i=2;i<MSD+2;i+) /*文件是否存在*/ if(!strcmp(cur_dir->,name)break; if(i>=MSD+2) /*文件不存在*/return(-1);/*

28、-是文件还是目录-*/ if(cur_dir->perty='1')/*是目录,不可打开读写*/return(-4); /*-文件是否打开-*/ for(j=0;j<MOFN;j+) if(!strcmp(u_,name)break; if(j<MOFN) /*文件已经打开*/return(-2); if(u_opentable.cur_size>=MOFN) /*文件打开太多*/return(-3); /*-查找一个空闲用户打开表项-*/ for(j=0;j<MOFN;

29、j+) if(u_opentable.openitemj.firstdisk=-1)break; /*-填写表项的相关信息-*/ u_opentable.openitemj.firstdisk = cur_dir->directitemi.firstdisk; strcpy(u_,name); u_opentable.openitemj.size = cur_dir->directitemi.size; u_opentable.cur_size+; /*-返回用户打开表表项的序号-*/ return(j);/*-*/*-关闭文件-*/

30、int close(char *name) int i; for(i=0;i<MOFN;i+) if(!strcmp(u_,name)break; if(i>=MOFN) /*-文件没有打开-*/ return(-1); /*-清空该文件的用户打开表项的内容-*/ strcpy(u_,""); u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_si

31、ze-; fd = -1; /*文件打开表的序号为 -1 */ return 0;/*-*/*-写文件-*/int write(int fd, char *buf, int len)char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/*-用 $ 字符作为空格 # 字符作为换行符-*/char Space = 32; /*SPACE的ASCII码值*/char Endter= 'n'for(i=0;i<len;i+)if(bufi = '$') /*用 $ 字符作为空格*/bufi =

32、Space;else if(bufi = '#')bufi = Endter;/*-读取用户打开表对应表项第一个盘块号-*/item = u_opentable.openitemfd.firstdisk;/*-找到当前目录所对应表项的序号-*/for(i=2;i<MSD+2;i+)if(cur_dir->directitemi.firstdisk=item)break;temp = i; /*-存放当前目录项的下标-*/*-找到的item 是该文件的最后一块磁盘块-*/while(fatitem.item!=-1) item =fatitem.item; /*-查找

33、该文件的下一盘块-*/*-计算除该文件的最末地址-*/first = fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE;/*-如果最后磁盘块剩余的大小大于要写入的文件的大小-*/if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE>len)strcpy(first,buf);u_opentable.openitemfd.size = u_opentable.openitemfd.size+len;cur_dir->directitemtemp.size = cur_dir-&

34、gt;directitemtemp.size+len;elsefor(i=0;i<(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE);i+)/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/ firsti = buf i;/*-计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-*/ilen1 = len-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE);ilen2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE;if(modlen>0)il

35、en2 = ilen2+1; /*-还需要多少块磁盘块-*/*调试时特别注意*/for(j=0;j<ilen2;j+)for(i=ROOT_DISK_NO+1;i<DISK_NUM;i+)/*寻找空闲磁盘块*/if(fati.em_disk='0')break;if(i>=DISK_NUM) /*-如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/if(j=ilen2-1) /*-如果是最后要分配的一块-*/for(k=0;k<len-(DISKSIZE-u_o

36、pentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+)firstk = bufk;else/*-如果不是要最后分配的一块-*/for(k=0;k<DISKSIZE;k+)firstk =bufk;fatitem.item = i; /*-找到一块后将它的序号存放在上一块的指针中-*/fati.em_disk = '1' /*-置找到的磁盘快的空闲标志位为已分配-*/fati.item = -1; /*-它的指针为 -1 (即没有下一块)-*/*-修改文件打开表用户的长度-*/u_opentable.openitemfd.size

37、 = u_opentable.openitemfd.size+len;/*-修改目录项的文件长度-*/cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len;return 0;/*-*/*-读文件-*/int read(int fd, char *buf)int len = u_opentable.openitemfd.size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitemfd.firstdisk;if(len&

38、gt;u_opentable.openitemfd.size) /*-欲读出的文件长度比实际文件长度长-*/return(-1);ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*-计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/for(i=0;i<ilen1;i+)if(i=ilen1-1) /*-如果在最后一个磁盘块-*/for(j=0;j<len-i*DISKSIZE;j+)bufi*DISKSIZE+j =

39、firstj;else /*-不在最后一块磁盘块-*/for(j=0;j<len-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;item = fatitem.item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;return 0;/*-*/*-删除文件-*/int del(char *name)int i,cur_item,item,temp;for(i=2;i<MSD+2;i+) /*-查找要删除文件是否在当前目录中-*/if(!strcmp(cur_dir->,name)

40、break;cur_item = i; /*-用来保存目录项的序号,供释放目录中-*/ if(i>=MSD+2) /*-如果不在当前目录中-*/return(-1);if(cur_dir->directitemcur_perty!='0') /*-如果删除的(不)是目录-*/return(-3);for(i=0;i<MOFN;i+) /*-如果文件打开,则不能删除,退出-*/if(!strcmp(u_,name)return(-2);item = cur_dir->directitemcur

41、_item.firstdisk;/*-该文件的起始盘块号-*/while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/temp = fatitem.item;fatitem.item = -1;fatitem.em_disk = '0'item = temp;/*-释放目录项-*/cur_dir->directitemcur_item.sign = 0;cur_dir->directitemcur_item.firstdisk = -1;strcpy(u_opentable.openitemcur_,"")

42、; cur_dir->directitemcur_item.next = -1; cur_dir->directitemcur_perty = '0'cur_dir->directitemcur_item.size = 0;return 0;/*-*/*-创建子目录-*/int mkdir(char *name)int i,j;struct direct *cur_mkdir;if(strchr(name,'')/*如果目录名中有 ''字符*/return(-4);if(!strcmp(name,".")return(-6);if(!strcmp(name,".")return(-6);if(strlen(name)>8) /*-如果目录名长度大于 8位-*/return(-1);for(i=2;i<MSD+2;i+) /*-如果有空闲目录项退出-*/if(cur_dir->directitemi.firstdisk=-1)break;if(i>=MSD+2) /*-目录/文件 已满-*/return(-2);for(j=2;j<MSD+2;j+) /*-判断是

温馨提示

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

评论

0/150

提交评论