




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
问题描述在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟UNIX文件系统 。基本要求 1在现有机器硬盘上开辟20M的硬盘空间,作为设定的硬盘空间。 2编写一管理程序对此空间进行管理,以模拟UNIX(linux)文件系统,具体要求如下:(1)要求盘块大小1k (2) i 结点文件类型 正规文件目录文件(共1byte)块设备 管道文件 。物理地址(索引表) 共有13个表项,每表项2byte 。文件长度 4byte 。联结计数 1byte (3)0号块 超级块 栈长度50 空闲盘块的管理:成组链接 ( UNIX) 位示图法 (Linux) (4)每建一个目录,分配4个物理块 文件名 14byte (5)目录项信息 i 结点号 2byte(6)结构: 0#: 超级块 1#20#号为 i 结点区 20#30#号为根目录区(7)功能: 1、初始化 2、建立文件(需给出文件名,文件长度) 3、建立子目录 4、打开文件(显示文件所占的盘块) 5、删除文件 6、删除目录 7、显示目录(即显示目录下的信息,包括文件、子目录等) 8、显示整个系统信息 2、模拟文件系统问题描述 在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的小型文件系统。基本要求该小型文件系统没有子目录机制,文件连续分配,不考虑分区。做一个简单的 操作界面,提供四条简单的命令:简单的ls、cat、cp、rd.进一步增强:上题中的文件系统功能:文件系统不连续分配,可以有子目录 机制,(如两级子目录机制)。附录 课程设计报告内容一实验题目与要求。二总的设计思想及环境说明、工具等。三本题所需数据结构与模块说明。四运行结果与运行情况。五自我评析与总结。1你认为你完成的哪些比较好或比较出色;2差距与局限,什么做的不太好或什么地方可以做的更好以待改进;3从本作业得到的收获:对编写与调试过程中经验教训的总结;4完成本题的其他方法或你的设想;5对本实验题的评价和改进意见。#include stdio.h #include #include #include int physic100;/文件地址缓冲区int style=1;/文件的类型char cur_dir10=root;/当前目录 struct commandchar com10;cmd12;struct blockint n;/空闲的盘快的个数int free50;/存放空闲盘快的地址int a;/模拟盘快是否被占用memory20449;struct block_superint n;/空闲的盘快的个数int free50;/存放进入栈中的空闲块int stack50;/存放下一组空闲盘快的地址super_block;struct node/i结点信息int file_style;/i结点 文件类型int file_length;/i结点 文件长度int file_address100;/i结点 文件的物理地址i_node640;struct dir/目录项信息char file_name10;/文件名int i_num;/文件的结点号char dir_name10;/文件所在的目录root640;void format()/格式化int i,j,k;super_block.n=50;for(i=0;i50;i+)/超级块初始化super_block.freei=i;/存放进入栈中的空闲块super_block.stacki=50+i;/存放下一组的盘块for(i=0;i640;i+)/i结点信息初始化for(j=0;j100;j+)i_nodei.file_addressj=-1;/文件地址i_nodei.file_length=-1;/文件长度i_nodei.file_style=-1;/文件类型for(i=0;i640;i+)/根目录区信息初始化strcpy(rooti.file_name,);rooti.i_num=-1;strcpy(rooti.dir_name,);for(i=0;i20449;i+)/存储空间初始化 memoryi.n=0;/必须有这个memoryi.a=0;for(j=0;j50;j+)memoryi.freej=-1;for(i=0;i20449;i+)/将空闲块的信息用成组链接的方法写进每组的最后一个块中/存储空间初始化if(i+1)%50=0)k=i+1;for(j=0;j50;j+)if(k20450)memoryi.freej=k;/下一组空闲地址memoryi.n+;/下一组空闲个数 注意在memoryi.n+之前要给其赋初值k+;elsememoryi.freej=-1;memoryi.a=0;/标记为没有使用continue;/处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环for(j=0;j50;j+)memoryi.freej=-1;memoryi.n=0;printf(已经初始化完毕n);printf(进入UNIX文件模拟.nn);void write_file(FILE *fp)/将信息读入系统文件中int i;fp=fopen(system,wb);for(i=0;i20449;i+)fwrite(&memoryi,sizeof(struct block),1,fp);fwrite(&super_block,sizeof(struct block_super),1,fp); for(i=0;i640;i+)fwrite(&i_nodei,sizeof(struct node),1,fp);for(i=0;i640;i+)fwrite(&rooti,sizeof(struct dir),1,fp);fclose(fp);void read_file(FILE *fp)/读出系统文件的信息int i;fp=fopen(system,rb);for(i=0;i20449;i+)fread(&memoryi,sizeof(struct block),1,fp);fread(&super_block,sizeof(struct block_super),1,fp);for(i=0;i640;i+)fread(&i_nodei,sizeof(struct node),1,fp);for(i=0;i=0;i-)k=physici;/需要提供要回收的文件的地址m=49-super_block.n;/回收到栈中的哪个位置if(super_block.n=50)/注意 当super_block.n=50时 m=-1;的值/super_block.n=50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中for(j=0;j50;j+)memoryk.freej=super_block.freej;super_block.n=0; memoryk.n=50;memoryk.a=0;if(m=-1)m=49;/将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息super_block.freem=physici;/将下一个文件地址中的盘块号回收到栈中super_block.n+;void allot(int length)/分配空间int i,j,k,m,p;for(i=0;ilength;i+)k=50-super_block.n;/超级块中表示空闲块的指针m=super_block.freek;/栈中的相应盘块的地址p=super_block.free49;/栈中的最后一个盘块指向的地址if(m=-1|memoryp.a=1)/检测是否还有下一组盘块printf(内存不足,不能够分配空间n);callback(length);break;if(super_block.n=1) memorym.a=1;/将最后一个盘块分配掉physici=m;super_block.n=0; for(j=0;jmemorym.n;j+)/从最后一个盘块中取出下一组盘块号写入栈中super_block.freej=memorym.freej;super_block.n+;continue;/要跳过这次循环,下面的语句在IF中已经执行过physici=m;/栈中的相应盘块的地址写进 文件地址缓冲区memorym.a=1;super_block.n-;void create_file(char filename,int length)/创建文件int i,j;for(i=0;i640;i+)if(strcmp(filename,rooti.file_name)=0)printf(文件已经存在,不允许建立重名的文件n);return;for(i=0;i640;i+)if(rooti.i_num=-1)rooti.i_num=i;strcpy(rooti.file_name,filename);strcpy(rooti.dir_name,cur_dir); /把当前目录名 给新建立的文件i_nodei.file_style=style;i_nodei.file_length=length;allot(length);for(j=0;jlength;j+)i_nodei.file_addressj=physicj;break;void create_dir(char filename)/创建目录style=0;/0代表文件类型是目录文件create_file(filename,4);style=1;/用完恢复初值,因为全局变量,否则void del_file(char filename)/删除文件int i,j,k;for(i=0;i640;i+)if(strcmp(filename,rooti.file_name)=0) k=rooti.i_num;for(j=0;ji_nodek.file_length;j+)physicj=i_nodek.file_addressj;callback(i_nodek.file_length);/调用 回收函数for(j=0;j100;j+)/删除文件后要将文件属性和目录项的各个值恢复初值i_nodek.file_addressj=-1;/地址恢复初值strcpy(rooti.file_name,);/文件名恢复初值rooti.i_num=-1;/目录项的I结点信息恢复初值strcpy(rooti.dir_name,);/目录项的文件目录信息恢复初值i_nodek.file_length=-1;/文件长度恢复i_nodek.file_style=-1;/文件类型恢复初值break;if(i=640)printf(不存在这个文件n);void del_dir(char filename)/删除目录 需要判断目录下时候为空,不为空就不删除int i,j,k;for(i=0;i640;i+)/还要加条件判断要删除的目录是不是当前目录k=rooti.i_num;/找到目录名字if( strcmp(rooti.file_name,filename)=0 &strcmp(cur_dir,filename)!=0 & (i_nodek.file_style)=0 ) for(j=0;j640;j+)if(strcmp(filename,rootj.dir_name)=0)printf(目录不为空不能直接删除n);break;if(j=640)del_file(filename);break;break;if(i=640)printf(这个不是目录文件 或者不存在这个目录,或者你要删除的是当前目录n);void display_curdir()/显示当前目录下的文件列表int i,k;printf(tt文件名字 文件类型 文件长度 所属目录n);for(i=0;i640;i+)if(strcmp(cur_dir,rooti.dir_name)=0)/查询文件中 所在目录信息和当前目录信息相同的数据k=rooti.i_num;printf(tt %st,rooti.file_name);/文件名printf(t%dt,i_nodek.file_style);/文件的类型printf(%dt,i_nodek.file_length);/文件的长度printf(%sn,rooti.dir_name);/文件所在的目录void display_dir(char filename)/进入指定的目录 int i,k;for(i=0;i640;i+)k=rooti.i_num;/判断文件类型是不是目录类型if(strcmp(filename,rooti.file_name)=0) & (i_nodek.file_style=0)strcpy(cur_dir,filename);/将要进入的指定目录设置为当前目录 赋值不要反了strcpy(目的,源)break;if(i=640)printf(没有这个目录n);void open_file(char filename)/打开文件int i,j,k;printf(tt文件名字 文件类型 文件长度 所属目录n);for(i=0;i640;i+)k=rooti.i_num;if(strcmp(filename,rooti.file_name)=0 & (i_nodek.file_style=1)printf(tt %st,rooti.file_name);/文件名printf(t%dt,i_nodek.file_style);/文件的类型printf(%dt,i_nodek.file_length);/文件的长度printf(%sn,rooti.dir_name);/文件所在的目录printf(tt文件占用的物理地址n);for(j=0;ji_nodek.file_length;j+)/显示物理地址printf(%d ,i_nodek.file_addressj);/文件具体占用的盘块号printf(n);break;if(i=640)printf(没有这个文件 或者这个文件不是正规文件n);void back_dir()/返回上一级目录int i,k;for(i=0;i640;i+)/查询和当前目录名相同的目录文件名k=rooti.i_num;if(strcmp(cur_dir,rooti.file_name)=0 & (i_nodek.file_style=0) strcpy(cur_dir,rooti.dir_name);/将查询到的目录文件名 所在的目录赋值给当前目录void display_sys()/显示系统信息(磁盘使用情况)int i,m,k=0;for(i=0;i20449;i+)if(memoryi.a=0)k+;m=20449-k;printf(空闲的盘块数是:t);printf(%dn,k);printf(使用的盘块数是:t);printf(%dn,m);void help()/显示帮助信息printf(注意:创建的文件长度 100nn);/说明文件printf(0.初始化-formatn);printf(1.查看当前目录文件列表-dirn);printf(2.查看文件-cat-(cat + 空格 + 文件名) n);printf(3.查看系统信息-ls n);printf(4.创建目录-md-(md + 空格 + 目录名) n);printf(5.创建文件-vi-(vi + 空格 + 文件名 + 文件长度) n);printf(6.删除文件-del-(del + 空格 + 文件名) n);printf(7.删除目录-deldir-(del + 空格 + 目录名)n);printf(8.进入当前目录下的指定目录-cd-(cd + 空格 + 目录名)n);printf(9.返回上一级目录-cd. n);printf(10.显示帮助命令-help n);printf(11.退出文件模拟-quit n);void main()/主函数char tmp10,com10,tmp110,k;struct command tmp210;int i, j=0,p,len=0;FILE *fp;help();strcpy(,format);/将各个命令存进命令表strcpy(,dir);strcpy(,cat);strcpy(,ls);strcpy(,md);strcpy(,vi);strcpy(,del);strcpy(,deldir);strcpy(,cd);strcpy(,cd.);strcpy(,help);strcpy(,quit);if(fp=fopen(system,rb)=NULL)/判断系统文件是否存在printf(can not open filen);printf(format the disk Y / Nn);scanf(%c,&k);if(k=y)format();elseread_file(fp);/读取系统文件的内容while(1)j=0;/必须重新给恢复0否则出错strcpy(tmp,cur_dir);while(strcmp(tmp,root)!=0)for(i=0;i=0;i-)printf(%s/,);scanf(%s,com);/输入命令并且查找命令的相关操作fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面包厂转让合同(标准版)
- 光伏发电质保合同(标准版)
- 2025软件工程自考试题及答案
- 2025-2030中国半无烟煤市场经营风险与未来发展状况评判报告
- 全球生物医药产业政策环境对商业化前景的影响分析报告
- 项目二 任务一 托盘实训(教案)《餐饮服务与管理》(高教版第二版)同步课堂
- 2025科技公司劳动合同范本
- 产品推销活动策划方案
- 全球数字医疗市场行业发展趋势及挑战分析报告2025
- 2025合作聘用合同范本:注册结构工程师合作协议书
- 高三一轮复习课件
- 驾驶员安全教育培训考试试卷含答案
- 2025广东河源市暨南大学附属第五医院急需紧缺人员招聘117人(第二批)笔试参考题库附答案解析
- 2025江苏航空产业集团有限责任公司人才招聘备考试题及答案解析
- 污水处理站运行记录台账范本
- 无人机地下结构探测技术-洞察及研究
- 督查督办培训课件
- 多媒体技术复习题及参考答案
- 北师大版义务教育小学数学教材知识体系整理
- 城市规划的发展与思想变革
- 2023全国大学生数学建模竞赛D题
评论
0/150
提交评论