已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文件管理系统模拟1.实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2.实验内容为linux系统设计一个简单的二级文件系统。要求做到以下几点:(1)可以实现下列几条命令(至少4条)login用户登录dir列文件目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。3.实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。(2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2并以编号作为物理地址,在目录中进行登记。4.源代码#include #include #include #define mem_d_size 1024*1024 /总磁盘空间为1m#define disksize 1024/磁盘块的大小1k#define disk_num 1024/磁盘块数目1k#define fatsize disk_num*sizeof(struct fatitem)/fat表大小#define root_disk_no fatsize/disksize+1/根目录起始盘块号#define root_disk_size sizeof(struct direct)/根目录大小#define dir_maxsize 1024/路径最大长度为1kb#define msd 5/最大子目录数5#define mofn 5/最大文件深度为5#define max_write 1024*128/最大写入文字长度128kb struct fatitem /* size 8*/ int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ ; struct direct /*-文件控制快信息-*/ struct fcb char name9; /*文件/目录名 8位*/ char property; /*属性 1位目录 0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录 起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录 0不是根目录*/ directitemmsd+2; ; struct opentable struct openttableitem char name9; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ openitemmofn; int cur_size; /*当前打文件的数目*/ ; struct fatitem *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 halt(); int create(char *name); int open(char *name); int close(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(); void format() int i; file *fp; fat = (struct fatitem *)(fdisk+disksize); /*计算fat表地址,引导区向后偏移 1k)*/ /*-初始化fat表-*/ fat0.item=-1; /*引导块*/ fat0.em_disk=1; for(i=1;iroot_disk_no-1;i+) /*存放 fat表的磁盘块号*/ fati.item=i+1; fati.em_disk=1; fatroot_disk_no.item=-1; /*存放根目录的磁盘块号*/ fatroot_disk_no.em_disk=1; for(i=root_disk_no+1;idirectitem0.sign = 1; root-directitem0.firstdisk = root_disk_no; strcpy(,.); root-directitem0.next = root-directitem0.firstdisk; perty = 1; root-directitem0.size = root_disk_size; /*-指向上一级目录的目录项-*/ root-directitem1.sign = 1; root-directitem1.firstdisk = root_disk_no; strcpy(,.); root-directitem1.next = root-directitem0.firstdisk; perty = 1; root-directitem1.size = root_disk_size; if(fp = fopen(disk.dat,wb)=null) printf(error:n cannot open file n); return; for(i=2;idirectitemi.sign = 0; root-directitemi.firstdisk = -1; strcpy(,); root-directitemi.next = -1; perty = 0; root-directitemi.size = 0; if(fp = fopen(disk.dat,wb)=null) printf(error:n cannot open file n); return; if(fwrite(fdisk,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); 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;i8) /*文件名大于 8位*/ return(-1); for(j=2;,name) break; if(jmsd+2) /*文件已经存在*/ return(-4); for(i=2;idirectitemi.firstdisk=-1) break; if(i=msd+2) /*无空目录项*/ return(-2); if(u_opentable.cur_size=mofn) /*打开文件太多*/ return(-3); for(j=root_disk_no+1;j=disk_num) return(-5); fatj.em_disk = 1; /*将空闲块置为已经分配*/ /*-填写目录项-*/ strcpy(cur_,name); cur_dir-directitemi.firstdisk = j; cur_dir-directitemi.size = 0; cur_dir-directitemi.next = j; cur_perty = 0; /*-*/ fd = open(name); return 0; int open(char *name) int i, j; for(i=2;,name) break; if(i=msd+2) return(-1); /*-是文件还是目录-*/ if(cur_perty=1)return(-4); /*-文件是否打开-*/ for(j=0;jmofn;j+) if(!strcmp(u_,name) break; if(j=mofn) /*文件打开太多*/ return(-3); /*-查找一个空闲用户打开表项-*/ for(j=0;jdirectitemi.firstdisk; strcpy(u_,name); u_opentable.openitemj.size = cur_dir-directitemi.size; u_opentable.cur_size+; /*-返回用户打开表表项的序号-*/ return(j); int close(char *name) int i; for(i=0;i=mofn) return(-1); /*-清空该文件的用户打开表项的内容-*/ strcpy(u_,); u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size-; 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; char endter= n; for(i=0;ilen;i+) if(bufi = $) bufi = space; else if(bufi = #) bufi = endter; /*-读取用户打开表对应表项第一个盘块号-*/ item = u_opentable.openitemfd.firstdisk; /*-找到当前目录所对应表项的序号-*/ for(i=2;idirectitemi.firstdisk=item) break; temp = i; /*-存放当前目录项的下标-*/ /*-找到的item 是该文件的最后一块磁盘块-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找该文件的下一盘块-*/ /*-计算出该文件的最末地址-*/ first = fdisk+item*disksize+u_opentable.openitemfd.size%disksize; /*-如果最后磁盘块剩余的大小大于要写入的文件的大小-*/ if(disksize-u_opentable.openitemfd.size%disksizelen) strcpy(first,buf); u_opentable.openitemfd.size = u_opentable.openitemfd.size+len; cur_dir-directitemtemp.size = cur_dir-directitemtemp.size+len; else for(i=0;i0) ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/ for(j=0;jilen2;j+) for(i=root_disk_no+1;i=disk_num) /*-如果磁盘块已经分配完了-*/ return(-1); first = fdisk+i*disksize; /*-找到的那块空闲磁盘块的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一块-*/ for(k=0;klen-(disksize-u_opentable.openitemfd.size%disksize)-j*disksize;k+) firstk = bufk; else/*-如果不是要最后分配的一块-*/ for(k=0;kdirectitemtemp.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; ilen1 = len/disksize; modlen = len%disksize; if(modlen!=0) ilen1 = ilen1+1; /*-计算文件所占磁盘的块数-*/ first = fdisk+item*disksize; /*-计算文件的起始位置-*/ for(i=0;iilen1;i+) if(i=ilen1-1) /*-如果在最后一个磁盘块-*/ for(j=0;jlen-i*disksize;j+) bufi*disksize+j = firstj; else /*-不在最后一块磁盘块-*/ for(j=0;jlen-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;,name) break; cur_item = i; /*-用来保存目录项的序号,供释放目录中-*/ if(i=msd+2) /*-如果不在当前目录中-*/ return(-1); if(cur_dir-directitemcur_perty!=0) /*-如果删除的(不)是目录-*/ return(-3); for(i=0;idirectitemcur_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_,); 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(!strcmp(name,.) return(-4); if(!strcmp(name,.) return(-4); if(strlen(name)8) /*-如果目录名长度大于 8位-*/ return(-1); for(i=2;idirectitemi.firstdisk=-1) break; if(i=msd+2) /*-目录/文件 已满-*/ return(-2); for(j=2;,name) break; if(jmsd+2) /*-如果有重名-*/ return(-3); for(j=root_disk_no+1;j=disk_num) return(-5); fatj.em_disk=1; /*-将该空闲块设置为已分配-*/ /*-填写目录项-*/ strcpy(cur_,name); cur_dir-directitemi.firstdisk=j; cur_dir-directitemi.size=root_disk_size; cur_dir-directitemi.next=j; cur_perty=1; /*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir-directitemi.firstdisk*disksize); /*-初始化目录-*/ /*-指向当前目录的目录项-*/ cur_mkdir-directitem0.sign=0; cur_mkdir-directitem0.firstdisk=cur_dir-directitemi.firstdisk; strcpy(cur_,.); cur_mkdir-directitem0.next=cur_mkdir-directitem0.firstdisk; cur_perty=1; cur_mkdir-directitem0.size=root_disk_size; /*-指向上一级目录的目录项-*/ cur_mkdir-directitem1.sign=cur_dir-directitem0.sign;cur_mkdir-directitem1.firstdisk=cur_dir-directitem0.firstdisk; strcpy(cur_,.); cur_mkdir-directitem1.next=cur_mkdir-directitem1.firstdisk; cur_perty=1; cur_mkdir-directitem1.size=root_disk_size; for(i=2;idirectitemi.sign=0; cur_mkdir-directitemi.firstdisk=-1; strcpy(cur_,); cur_mkdir-directitemi.next=-1; cur_perty=0; cur_mkdir-directitemi.size=0; return 0; int rmdir(char *name) int i,j,item; struct direct *temp_dir; /*-检查当前目录项中有无该目录-*/ for(i=2;,name) break; if(i=msd+2) /*-没有这个文件或目录-*/ return(-1);if(cur_perty!=1)/*-删除的不是目录-*/ return(-3); /*-判断要删除的目录有无子目录-*/ temp_dir=(struct direct *)(fdisk+cur_dir-directitemi.next*disksize); for(j=2;jdirectitemj.next!=-1) break; if(jdirectitemi.firstdisk; fatitem.em_disk=0; /*-修改目录项-*/ cur_dir-directitemi.sign=0; cur_dir-directitemi.firstdisk=-1; strcpy(cur_,); cur_dir-directitemi.next=-1; cur_perty=0; cur_dir-directitemi.size=0; return 0; void dir() int i; for(i=2;idirectitemi.firstdisk!=-1) /*-如果存在子目录-*/ printf(%st,cur_); if(cur_perty=0) /*-文件-*/ printf(%dttn,cur_dir-directitemi.size); else printf(ttn); int cd(char *name) int i,j,item; char *str; char *temp,*point,*point1; struct direct *temp_dir; temp_dir=cur_dir; str=name; if(!strcmp(,name) cur_dir = root; strcpy(bufferdir,root:); return 0; temp = (char *)malloc(dir_maxsize*sizeof(char);/*-最长路径名字分配空间-*/ for(i=0;i(int)strlen(str);i+) tempi=stri; tempi=0; for(j=0;,temp) break; free(temp);/*释放申请的临时空间*/ /if(temp_perty!=1) /*-打开的不是目录-*/ /return(-2); if(j=msd+2) /*-不在当前目录-*/ return(-1); item=temp_dir-directitemj.firstdisk; /*-当前目录在磁盘中位置-*/ temp_dir=(struct direct *)(fdisk+item*disksize); if(!strcmp(.,name) if(cur_dir-directitemj-1.sign!=1) /*-如果上级目录不是根目录-*/ point=strchr(bufferdir,); /查找字符串bufferdir中首次出现字符 的位置while(point!=null) point1=point+1; /*-减去所占的空间,记录下次查找的起始地址-*/ point=strchr(point1,); *(point1-1)=0; /*-将上一级目录删除-*/ else /if(name0 !=) bufferdir = strcat(bufferdir,); /*-修改当前目录-*/ bufferdir = strcat(bufferdir,name); cur_dir=temp_dir; /*-将当前目录确定下来-*/ return 0; void show() printf(%s,bufferdir); void print() printf(*n);printf(*文件系统设计*n); printf(*t命令格式说明*n); printf(*tcd 目录名更改当前目录*n); printf(*tmkdir 目录名创建子目录*n); printf(*trmdir 目录名删除子目录*n); printf(*tdir显示当前目录的子目录*n); printf(*tcreate 文件名创建文件*n); printf(*tdel 文件名删除文件*n); printf(*topen 文件名打开文件*n); printf(*tclose 文件名关闭文件*n); printf(*tread读文件*n); printf(*twrite写文件*n); printf(*texit退出系统*n); printf(*n); void main() file *fp; char ch; char a100; char code1110; char name10; int i,flag,r_size; char *contect; contect = (char *)malloc(max_write*sizeof(char); if(fp=fopen(disk.dat,rb)=null) printf(you have not format,do you want format?(y/n); scanf(%c,&ch); if(ch=y) initfile(); printf(successfully format! n); else return; enter();print(); sh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 店长年度考核的个人总结范文(3篇)
- 珠宝行业工作计划6篇
- 高中技术《第二章流程与设计》单元检测
- 有关辅导员开学的讲话稿范文(3篇)
- 新教材高考地理二轮复习二7类选择题技法专项训练技法2直选法含答案
- 第24章 解直角三角形 综合检测
- 第二十六章 解直角三角形 综合检测
- 山西省太原市2024-2025学年高三上学期期中物理试卷(含答案)
- 河南省周口市扶沟县2024-2025学年六年级上学期11月期中道德与法治试题
- 2024-2025中山市共进联盟七年级上期中考试生物试卷
- 尿管滑脱不良事件分析
- 临床试验方案偏离处理流程
- 盘扣脚手架搭设方案及交底
- JTT327-2016 公路桥梁伸缩装置通用技术条件
- 定量化学分析实验室的整理、整顿、清扫
- (高清版)TDT 1037-2013 土地整治重大项目可行性研究报告编制规程
- 山东省青岛市市南区2023-2024学年九年级上学期期中数学试题
- 《美容营养学》课件-第八章 第二节 美胸丰胸营养与膳食
- 爱国卫生工作培训课件
- 与某地政府医疗领域合作框架协议
- 外卖骑手劳动权益保障机制
评论
0/150
提交评论