




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计报告简单文件系统的实现专业: 班级: 姓名: 学号: 老师: 一、课程设计的目的1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。二、 课程设计要求1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。2文件存储空间的分配可采用显式链接分配或其他的办法。3空闲磁盘空间的管理可选择位示图或其他的办法。如果采
2、用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到fat中。文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。要求提供以下有关的操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。my_mkdir:用于创建子目录。my_rmdir:用于删除子目录。my_ls:用于显示目录中的内容。my_cd:用于更改当前目录。my_create:用于创建文件。my_open:用于
3、打开文件。my_close:用于关闭文件。my_write:用于写文件。my_read:用于读文件。my_rm:用于删除文件。my_exitsys:用于退出文件系统。三、程序的设计细想和框图1打开文件函数fopen() (1)格式:file *fopen(const char *filename,const char *mode) (2)功能:按照指定打开方式打开指定文件。(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。mode: 文件打开方式,常用的有:r:为读而打开文本文件(不存在则出错)。w:为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写
4、,原内容将被覆盖)。a:为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾追加)。r+:为读和写而打开文本文件。(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变) 。w+:首先建立一个新文件,进行写操作,随后可以从头开始读。(若文件存在,原内容将全部消失) 。a+:功能与a相同;只是在文件末尾添加新的数据后,可以从头开始读。 另外,上述模式字符串中都可以加一个“b”字符,如rb、wb、ab、rb+、wb+、ab+等组合,字符“b”表示fopen() 函数打开的文件为二进制文件,而非纯文字文件。(4)输出:一个指向file类型的指针。2关闭文件函数fcl
5、ose()(1)格式:int fclose(file * stream);(2)功能:用来关闭先前fopen()打开的一个文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。(3)输入参数说明: stream:指向要关闭文件的指针,它是先前执行fopen()函数的返回值。(4)输出:若关闭文件成功则返回0;有错误发生时则返回eof并把错误代码存到errno。3读文件函数fread()(1)格式:size_t fread( void *buffer, size_t size, size_t count, file *stream );(2)功能:读二进制文件到内存。(3)输入参
6、数说明: buffer:用于存放输入数据的缓冲区的首地址; stream:使用fopen()打开的文件的指针,用于指示要读取的文件; size: 每个数据块的字节数; count: 要读入的数据块的个数; size*count:表示要求读取的字节数。(4)输出:实际读取的数据块的个数。4写文件函数fwrite() (1)格式:size_t fwite(const void *buffer,size_t size,size_t count,file *stream); (2)功能:将数据写到二进制文件中。(3)输入参数说明:buffer:用于存放输出数据的缓冲区的首地址; stream:使用fo
7、pen()打开的文件的指针,用于指示要写出的文件; size: 每个数据块的字节数; count: 要写出的数据块的个数; size*count:表示要求写出的字符数。(4)输出:实际写出的数据块的个数。5判断文件结束函数feof ()(1)格式:int feof(file * stream)(2)功能:用来判断是否已读取到文件末尾。(3)输入参数说明:stream:使用fopen()打开的文件的指针,用于指示要判断的文件。(4)输出:如果已读到文件尾则返回非零值,其他情况返回0。6 主要函数功能实现:int format(); / 格式化磁盘int mkdir(char *sonfname)
8、; / 创建子目录int rmdir(char *sonfname); / 删除子目录int create(char *name); / 创建文件int listshow();/ 显示子文件信息int delfile(char *name); /删除文件int changepath(char *sonfname);/ 更改当前路径int write(char *name); / 写入文件int exit();/退出系统int open(char *file);/打开文件int close(char *file);/ 关闭文件int read(char *file);/读取文件7 主要的框架四、
9、程序实现和程序调试遇到的问题的分析1 对于dos的文件操作使用不熟悉,经常输入错误命令2调试的时候跟踪变量的时候,难以锁定实际的变量是什么3 对于文件的存储结构不熟悉,在构造fat的时候不知如何解决,查阅了大量的资料和跟老师交流才慢慢开始理解4由于买的实验册对于文件的介绍过于简单,导致理解上出现很大的困难。五、结果分析和总结1基本上实现了dos下简单文件系统的实现,通过学习基本掌握了文件系统的存储结构2当遇到困难的时候通过认真思考很查阅资料很大问题都是可以自己解决的。通过这次实验锻炼了自己的动手的能力和分析问题的能力3在构造函数的时候可以开阔思维同时加深自己对文件系统实现的理解4通过这样的实验
10、开始对dos的环境文件命令输入有了初步的理解5通过跟老师的讨论解决自己心中的疑惑六、程序#include #include #include #include using namespace std;#define general 1/1代表普通文件2代表目录文件0表示空文件#define directory 2#define zero 0struct fcbchar fname16; /文件名char type; / 0空文件 1目录文件 2空文件 int size; /文件大小int fatherblocknum; /当前的父目录盘块号int currentblocknum; /当前的盘块
11、void initialize()strcpy(fname,0);type = zero;size =0;fatherblocknum = currentblocknum = 0; const char* filepath = c:myfiles;/*常量设置*/const int blocksize = 512; /盘块大小const int open_max = 5; /能打开最多的文件数const int blockcount = 128; /盘块数const int disksize = blocksize * blockcount; /磁盘大小const int blockfcbco
12、unt = blocksize/sizeof(fcb);/目录文件的最多fcb数int openfilecount = 0; / 统计当前打开文件数目 struct openlist /用户文件打开表int files; /当前打开文件数fcb fopen_max; /fcb拷贝openlist()files=0;for(int i=0;iopen_max;i+)fi.fatherblocknum = -1;/为分配打开fi.type=general;struct dirfile/*-目录文件结构-*/struct fcb fcbblockfcbcount;void init(int _fat
13、herblocknum,int _currentblocknum,char *name)/父块号,当前块号,目录名strcpy(fcb0.fname,name); /本身的fcbfcb0.fatherblocknum=_fatherblocknum;fcb0.currentblocknum=_currentblocknum;fcb0.type=directory; /标记目录文件for(int i=1;iformat();/打开文件列表初始化delete openlist;openlist=new openlist;/*-保存到磁盘上myfiles-*/fp = fopen(filepath,
14、w+);fwrite(baseaddr,sizeof(char),disksize,fp);fclose(fp);printf(格式化成功!n);return 1;int mkdir(char *sonfname)/*-创建子目录-*/判断是否有重名寻找空白子目录项寻找空白盘块号当前目录下增加该子目录项分配子目录盘块,并且初始化修改fat表int i,temp,ifat;struct dirfile *dir; /当前目录的指针if(current = 2) / 根目录 dir=&(ospoint-root);elsedir=(struct dirfile *)(ospoint-data cu
15、rrent-3);/*-为了避免该目录下同名文件夹-*/for(i = 1;ifcbi.type=directory & strcmp(dir-fcbi.fname,sonfname)=0 )printf(该文件夹下已经有同名的文件夹存在了!n);return 0;for(i = 1;i fcbi.type=zero)break;if(i = blockfcbcount)printf(该目录已满!请选择新的目录下创建!n);return 0;temp = i;for(i = 3;i fat1i = 0)break;if(i = blockcount)printf(磁盘已满!n);return
16、0;ifat=i;/*-接下来进行分配-*/ospoint-fat1ifat=ospoint-fat2ifat = 2; /2表示分配给下级目录文件/填写该分派新的盘块的参数strcpy(dir-fcbtemp.fname,sonfname);dir-fcbtemp.type=directory;dir-fcbtemp.fatherblocknum=current;dir-fcbtemp.currentblocknum=ifat;/初始化子目录文件盘块dir=(struct dirfile*)(ospoint-data ifat-3); /定位到子目录盘块号dir-init (current,
17、ifat,sonfname);/ifat是要分配的块号,这里的current用来指要分配的块的父块号printf(创建子目录成功!n);return 1;int rmdir(char *sonfname)/*-删除当前目录下的文件夹-*/int i,temp,j;/确保当前目录下有该文件,并记录下该fcb下标struct dirfile *dir; /当前目录的指针if(current=2)dir=&(ospoint-root);elsedir=(struct dirfile *)(ospoint-data current-3);for(i=1;ifcbi.type=directory & s
18、trcmp(dir-fcbi.fname,sonfname)=0)break;temp=i;if(i=blockfcbcount)printf(当前目录下不存在该子目录!n);return 0;j = dir-fcbtemp.currentblocknum;struct dirfile *sondir; /当前子目录的指针sondir=(struct dirfile *)(ospoint-data j - 3);for(i=1;ifcbi.type!=zero)printf(该文件夹为非空文件夹,为确保安全,请清空后再删除!n);return 0;/*开始删除子目录操作*/ospoint-fa
19、t1j = ospoint-fat2j=0; /fat清空char *p=ospoint-dataj-3; /格式化子目录memset(p,0,blocksize);dir-fcbtemp.initialize(); /回收子目录占据目录项 printf(删除当前目录下的文件夹成功n);return 1;/*-在当前目录下创建文本文件-*/int create(char *name)int i,ifat;/temp,int emptynum = 0,isfound = 0; /空闲目录项个数struct dirfile *dir; /当前目录的指针if(current=2)dir=&(ospo
20、int-root);elsedir=(struct dirfile *)(ospoint-data current-3);for(i=1;ifcbi.type = zero & isfound = 0)emptynum = i;isfound = 1;else if(dir-fcbi.type=general & strcmp(dir-fcbi.fname,name)=0 )printf(无法在同一目录下创建同名文件!n);return 0;if(emptynum = 0)printf(已经达到目录项容纳上限,无法创建新目录!n);return 0;for(i = 3;ifat1i=0)bre
21、ak;if(i=blockcount)printf(磁盘已满!n);return 0;ifat=i;/*-进入分配阶段-*/分配磁盘块ospoint-fat1ifat = ospoint-fat2ifat = 1;/*-接下来进行分配-*/填写该分派新的盘块的参数strcpy(dir-fcbemptynum.fname,name);dir-fcbemptynum.type=general;dir-fcbemptynum.fatherblocknum=current;dir-fcbemptynum.currentblocknum=ifat;dir-fcbemptynum.size =0;char
22、* p = ospoint-dataifat -3;memset(p,4,blocksize);printf(在当前目录下创建文本文件成功!n);return 1;/*-查询子目录-*/int listshow()int i,dircount=0,filecount=0;/搜索当前目录struct dirfile *dir; /当前目录的指针if(current=2)dir=&(ospoint-root);elsedir=(struct dirfile *)(ospoint-data current-3);for(i=1;ifcbi.type=general) /查找普通文件filecount
23、+;printf(%s 文本文件.n,dir-fcbi.fname);if(dir-fcbi.type=directory) /查找目录文件dircount+;printf(%s 文件夹.n,dir-fcbi.fname);printf(n该目录下共有 %d 个文本文件, %d 个文件夹nn,filecount,dircount);return 1;/*-在当前目录下删除文件-*/int delfile(char *name)int i,temp,j;/确保当前目录下有该文件,并且记录下它的fcb下标struct dirfile *dir; /当前目录的指针if(current = 2)dir
24、=&(ospoint-root);elsedir=(struct dirfile *)(ospoint-data current-3);for(i=1;i fcbi.type=general & strcmp(dir-fcbi.fname,name)=0)break;if(i = blockfcbcount)printf(当前目录下不存在该文件!n);return 0;int k;for(k=0;kf k.type = general)&(strcmp(openlist-f k.fname,name)=0)if(openlist-fk.fatherblocknum = current)brea
25、k;elseprintf(该文件未在当前目录下!n);return 0;if(k!=open_max)close(name);/从打开列表中删除/*开始删除文件操作*/temp=i;j = dir-fcb temp.currentblocknum ; /查找盘块号jospoint-fat1j=ospoint-fat2j=0; /fat1,fat2表标记为空白char *p=ospoint-dataj - 3;memset(p,0,blocksize); /清除原文本文件的内容dir-fcbtemp.initialize(); /type=0; /标记该目录项为空文件printf(在当前目录下删
26、除文件成功!n);return 1;/*-进入当前目录下的子目录-*/int changepath(char *sonfname)struct dirfile *dir; /当前目录的指针if(current=2)dir=&(ospoint-root);elsedir=(struct dirfile *)(ospoint-data current-3);/*回到父目录*/if(strcmp(sonfname,.)=0)if(current=2)printf(你现已经在根目录下!n);return 0;current = dir-fcb0.fatherblocknum ;currentpath
27、= currentpath.substr(0,currentpath.size() - strlen(dir-fcb0.fname )-1);return 1;/*进入子目录*/确保当前目录下有该目录,并且记录下它的fcb下标int i,temp;for(i = 1; i fcbi.type=directory&strcmp(dir-fcbi.fname,sonfname)=0)temp=i;break;if(i=blockfcbcount)printf(不存在该目录!n);return 0;/修改当前文件信息current=dir-fcb temp.currentblocknum ;curr
28、entpath = currentpath+dir-fcb temp.fname +;printf(进入当前目录下的子目录成功!n);return 1;int exit()/保存到磁盘上c:myfiles/将所有文件都关闭/*-system exit-*/fp=fopen(filepath,w+);fwrite(baseaddr,sizeof(char),disksize,fp);fclose(fp);/释放内存上的虚拟磁盘free(ospoint);/释放用户打开文件表delete openlist;printf(退出文件系统成功!nn);return 1;int write(char *n
29、ame)/*-在指定的文件里记录信息-*/int i;char *startpoint,*endpoint;/在打开文件列表中查找 file(还需要考虑同名不同目录文件的情况!) for(i=0;if i.fname,name)=0 )if(openlist-fi.fatherblocknum =current)break;elseprintf(该文件处于打开列表中,本系统只能改写当前目录下文件!n);return 0;if(i=open_max)printf(该文件尚未打开,请先打开后写入信息!n);return 0;int active=i;int filestartnum = openl
30、ist-factive.currentblocknum - 3 ;startpoint = ospoint-datafilestartnum;endpoint = ospoint-datafilestartnum + 1;printf(请输入文本以ctrl d号结束:t);char input;while(input=getchar()!=4)if(startpoint endpoint-1)*startpoint+ = input;elseprintf(达到单体文件最大容量!);*startpoint+ = 4;break;return 1;int read(char *file)/*-选择
31、一个打开的文件读取信息-*/int i,filestartnum;char *startpoint,*endpoint;/struct dirfile *dir;/在打开文件列表中查找 file(还需要考虑同名不同目录文件的情况!)for(i=0;if i.fname,file)=0 )if(openlist-fi.fatherblocknum =current)break;elseprintf(该文件处于打开列表中,本系统只能阅读当前目录下文件!n);return 0;if(i=open_max)printf(该文件尚未打开,请先打开后读取信息!n);return 0;int active=
32、i;/计算文件物理地址filestartnum = openlist-factive.currentblocknum - 3 ;startpoint = ospoint-datafilestartnum;endpoint = ospoint-datafilestartnum + 1;printf(该文件的内容为: );while(*startpoint)!=4& (startpoint endpoint)putchar(*startpoint+);printf(n);return 1;int open(char *file)/打开文件/*当前目录下添加一个打开文件*/int i,fcbinde
33、x;/确保没有打开过该文件 = 相同名字 + 相同目录for(i=0;ifi.type =general & strcmp(openlist-f i.fname,file)=0 &openlist-fi.fatherblocknum = current)printf(该文件已经被打开!n);return 0;/确保有空的打开文件项if(openlist-files = open_max)printf(打开文件数目达到上限!无法再打开新文件.n);return 0;/确保当前目录下有该文件,并且记录下它的fcb下标struct dirfile *dir; /当前目录的指针if(current=2
34、)dir=&(ospoint-root);elsedir=(struct dirfile *)(ospoint-data current-3);for(i = 1;ifcbi.type=general & strcmp(dir-fcbi.fname,file)=0 )fcbindex=i;break;if(i=blockfcbcount)printf(当前目录下不存在该文件!n);return 0;/装载新文件进入打开文件列表,(fcb信息,文件数+) ?难道名字过不来?openlist-fopenfilecount = dir-fcbfcbindex; /fcb拷贝openlist-file
35、s +;printf(文件打开成功!n);openfilecount+;return 1;int close(char *file)/释放该文件所占内存/释放用户打开文件列表表项int i;/在打开文件列表中查找 file(还需要考虑同名不同目录文件的情况!)for(i=0;if i.type = general)&(strcmp(openlist-f i.fname,file)=0)if(openlist-fi.fatherblocknum = current)break;elseprintf(该文件已打开,但未在当前目录下,无法关闭!n);return 0;if(i=open_max)pr
36、intf(该文件未在打开列表中!n);return 0;int active=i;openlist-files -;openlist-factive.initialize();openfilecount-;printf(该文件已关闭!n);return 1;int main()printf( welcome to my operate system of file(fat) n);printf(n 以下是使用说明书:n);/使用说明书printf(n);printf( format :对磁盘格式化. n);printf( exit :安全退出该文件系统,保存信息. n);printf( mkdir dirname :创建子目录. n);printf( rmdi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 门面房租赁合同
- 安全施工管理培训课件
- 安全施工培训课程内容课件
- 安全施工培训教案课件
- (苏教2024版)科学三年级上册1.3 肥沃的土壤 课件(新教材)
- 二一一工程实施方案(3篇)
- 安全文明用语培训课件
- 球面透镜的矫正原理
- 防城港市上思县妇幼保健院整体搬迁项目(一期)环境影响报告表
- 农业气象服务创新与智慧农业产业链协同发展研究
- 仪表联锁培训课件
- 燃气行业安全生产费用提取标准
- 2025初中人教版七年级历史上册全册教案
- 砌体结构工程施工课件
- 如何当好幼儿园班主任幼儿园班主任培训
- 专升本语文基础知识课件
- 无陪护病房护理汇报
- 脑循环功能障碍治疗仪讲课件
- 《区块链智能合约技术与应用》全套教学课件
- 青岛租房合同协议书下载
- 保安服务台账资料相关表格
评论
0/150
提交评论