版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文件管理系统模拟1. 实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2. 实验内容为Linux系统设计一个简单的二级文件系统。要求做到以下几点:()可以实现下列几条命令(至少 4条)logi n用户登录列文件目录创建文件删除文件打开文件关闭文件读文件dircreateedeletope nclosereadwrite写文件(2) 列目录时要列出文件名、物理地址、保护码和文件长度;(3) 源文件可以进行读写保护。3. 实验提示(1) 首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。(2)file
2、0,file1,file2 并以于磁盘上。入DISK_NUM*sizeof(struct fatitem) /FAT表编号作为物理地址,在目录中进行登记。大小4. 源代码#defi neROOT_DISK_NO#i nclude#i nclude#i ncludeFATSIZE/DISKSIZE+1/根目录起始盘块号#defi neROOT_DISK_SIZEsizeof(struct direct)/ 根#defi ne MEM_D_SIZE 1024*1024/总磁盘空间为1M目录大小#defi ne DIR_MAXSIZE 1024/路径最大长度为1KB#defi ne MSD 5#de
3、fi ne DISKSIZE 1024/磁盘块的大小1K#defi ne DISK_NUM 1024/磁盘块数目1K#defi neFATSIZE/最大子目录数5#defi ne MOFN 5ope nitemMOFN;int cur_size; /*当前打文件的/最大文件深度为5数目*/#defi ne MAX_WRITE 1024*128;/最大写入文字长度128KB表*/根目录*/当前struct fatitem *fat; /*FATstruct direct *root; /*struct direct *cur_dir; /*struct fatitem /* size 8*/in
4、t item; /* 存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位0空闲*/目录*/struct ope ntable u_ope ntable; /*文件打开表*/int fd=-1; /*文件打开表的序号*/;记录当前路struct direct虚拟磁盘起始地/*一 文件控制快信息一*/struct FCBvoid ini tfile();void format();void en ter();char n ame9;名8位*/*char property; /* 属性目录0位普通文件*/int size; /*节数、盘块数)*/int firstdis
5、k; /*文件/目录1位void halt();int create(char *n ame);int ope n( char *n ame);文件目录字/int close(char *n ame);int write(i nt fd,char *buf,i nt文件目/录起始盘块号*/int next; /*块号*/len);子目录起始盘int sig n; /*1是根目录0 int mkdir(char *n ame);int rmdir(char *n ame);不是根目录*/void dir();directitemMSD+2;int cd(char *n ame);void pri
6、n t();void show();struct opentablevoid ini tfile()(charstruct opefdisk=*)malloc(MEM_D_SIZE*sizeof(char)文件名*/);/* 申请1M*/int firstdisk; /*起始盘块format();号*/int size; /* 文件的大小*/void format() =1;root-directitem0.size=int i;ROOT_DISK_SIZE;/* - 指向上一级目录的目录项-*/FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE)
7、;/* 计算 FAT表地址,引导区向后偏移1k)*/root-directitem1.sig n = 1;root-directitem1.firstdisk=ROOT_DISK_NO;strcpy(root-directitem1. name,.);root-directitem1. nextroot-directitem0.firstdisk;perty=1;/*- 初始化 FAT 表- */fat0.item=-1; /*fat0.em_disk=1引导块*/=for(i=1;idirectitem1.sizeROOT_DISK_SIZE;=if(
8、fpfatROOT_DISK_NO.item=-1;/*存放根目录的磁盘块号*/fope n(disk.dat,wb)=NULL)fatROOT_DISK_NO.em_disk=1prin tf(Error:nope n file n);return;Cannotfor(i=ROOT_DISK_NO+1;iDISK_NUM;i+)for(i=2;idirectitemi.sig n = _0;/* -*/root = (struct direct*)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/root-directitemi.firstdisk=-1;strcpy(
9、root-directitemi. na/*初始化目录*/me,);-1;/* - 指向当前目录的目录项-*/root-directitemi. next =root-directitem0.sig n = 1;root-directitem0.firstdisk=ROOT_DISK_NO;pertyroot-directitemi.size =0;strcpy(root-directitem0. name,.);root-directitem0. nextroot-directitem0.firstdisk;pe
10、rty=0;fat = (struct fatitem*)(fdisk+DISKSIZE); /* 找至U FAT表if(fp=地址*/fope n( disk.dat,wb)=NULL)root = (struct direct*)(fdisk+DISKSIZE+FATSIZE);/* 找到根目录地址*/prin tf(Error:nope n file n);Cannotfclose(fp);return;/*- 初始化用户打 if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /* 把虚拟磁盘空间保存到磁开表-*/for(i=0;i=MOFN) /* 打开文件太多*
11、/return(-3);读入磁盘文件disk.dat */prin tf(Error:nFile writeerror!n);for(j=ROOT_DISK_NO+1;j=DISK_NUM) return(-5);fatj.em_disk = 1; /*将空闲块置为已经分配*/*- 填写目录项- */int create(char *n ame)int i,j;strcpy(cur_dir-directitemi. name, name);if(strle n(n ame)8) /*文件名大于8位*/cur_dir-directitemi.firstdisk=j;return(-1);cur_
12、dir-directitemi.size =for(j=2;jdirectitemi. next =j;if(!strcmp(cur_dir-directite , name) break;cur_perty = 0; if(jMSD+2) /*在*/文件已经存/*-*/fd = ope n(n ame);return 0;return(-4);for(i=2;idirectitemi.firstdisk=-1)int i, j;break;if(i=MSD+2) /* 无空目录项 */return(-2);strcpy(u_ope ntab
13、le.ope ,n ame);for(i=2;idirectitemi.size;u_ope ntable.cur_size+;/*- 返回用户打开表表if(!strcmp(cur_dir-directite , name) break; if(i=MSD+2) return(-1);/* - 是文件还是目录-*/项 的 序- */号return(j);if(cur_perty=1) return(-4);int close(char *n ame)/* - 文件是否打开-*/for(j=0;jMOFN;j+)int
14、i;for(i=0;iMOFN;i+)if(!strcmp(u_ope ntable.ope nit , name) break;if(!strcmp(u_ope ntable.ope nitemi. name, name)break;if(j=MOFN)return(-1);/*- 清空该文件的用户打开表项的内容 */if(u_ope ntable.cur_size=MOFN) /* 文件打开太多*/strcpy(u_ope ntable.ope ni ,);return(-3);/* - 查找一个空闲用户打开表项-*/for(j=0;jdirectitem
15、i.firstdiskJreturn 0;最 后一块 磁 盘 块 */ int write(i nt fd, char *buf, i nt len)while(fatitem.item!=-1)char *first;item =fatitem.item; /*-int item, i, j, k;查找该文件的下一盘块-*/int ilen1, ilen2, modlen, temp;/* - 用字符作为空格# 字符作为换行符 */*- */first计算出该文件的最末地址char Space = 32;char En dter= n;=fdisk+item*DISKSIZE+u_ope n
16、table.ope nitemfd.size%DISKSIZE;for(i=0;ile n) strcpy(first,buf);/* - 读取用户打开表对u_ope ntable.ope ni temfd.sizeu_ope ntable.ope nitemfd.size+le n;应表项第一个盘块号-*/下标-*/* - 找到的item是该文件的item= le.ope nitemfd.size%DISKSIZE);i +)u_ope ntable.ope nitemfd.firstdi sk;/*写一部分内容到最后一块 磁(盘块的剩余空间 字节)*/*- 找到当前目录所firsti =
17、buf i;对 应 表 项-*/的 序 号/*- 计算分配完最后一块磁盘( )的剩余空间 字节 还剩下多少 字节未存储-for(i=2;idirectitemi.firstdisk=item)break;ile n2 = ile n1/DISKSIZE; modlen = ilen 1%DISKSIZE; if(modlen0)temp = i; /*- 存放当前目录项的ilen2 = ilen 2+1;还需要多少块磁盘块-*/*-cur_dir-directitemtemp.siz ecur_dir-directitemtemp.size+l en;for(j=0;jile n2;j+)el
18、sefor(i=ROOT_DISK_NO+1;iDISK_for(i=0;idirectitemtemp.sizif(fati.em_disk=O)break;e=cur_dir-directitemtemp.size+len; if(i=DISK_NUM) 如果磁盘块已经分配完了 -*/return(-1);first=return 0;fdisk+i*DISKSIZE; /*- 找到的那块空闲磁盘块的起始地址-*/int read(i nt fd, char *buf)if(j=ile n2-1) /*-如果是最后要分配的一块-*/intlen=u_ope ntable.ope nitem
19、fd.size;char *first;for(k=0;kle n-(DISKSIZE-u_opentable.ope nitemfd.size%DISKSIZE)-j*DISKSIZE;k+)int i, j, item;int ile n1, modle n;firstk=itembufk;u_ope ntable.ope nitemfd.firstdi sk;else/*-如果不是要最后分配ile n1 = len/DISKSIZE; modle n =len %DISKSIZE;的一块-*/if(modle n!=0)for(k=0;k=MSD+2) /*-如果不在当前/*-计算文件的
20、起始位置-*/目录中-*/ return(-1);for(i=0;idirectitemcur_perty!=0) /*- 如果删除的(不)是目录-*/if(i=ile n1-1) /*-如果在最后一个磁盘块-*/return(-3);for(j=0;jle n-i*DISKSIZE;j+)bufi*DISKSIZE+j= firstj;if(!strcmp(u_ope ntable.ope nit , name)else /*-不在最后一块磁盘块-*/return(-2);item=for(j=0;jdirectitemcur_item.firstdisk;/
21、*- 该文件的起始盘块号 -*/,while(item!=-1) /*- 释放空间 将FAT表对应项进行修改-*/*-查找下一盘块-*/first fdisk+item*DISKSIZE;temp = fatitem.item;fatitem.item = -1;fatitem.em_disk = 0; item =temp;return 0; int del(char *n ame)int i,cur_item,item,temp;/*- 释放目录项- */for(i=2;idirectitemcur_item.sig n = 0;cur_dir-directitemcur_item .fi
22、rstdisk = -1;要删除文件是否在当前目录中-*/if(!strcmp(cur_dir-directitemi. name, name) break;strcpy(u_ope ntable.ope nitemcur_item. name,);cur_item = i; /*- 用来保存目录cur_dir-directitemcur_item. ne xt = -1;cur_dir-directitemcur_item.prfor(i=0;idirectitemcur_item.size = 0;if(fatj.em_disk=0) break; if(j=DISK_NUM) retur
23、n(-5);fatj.em_disk=1; /*-将该空闲块设置为已分配-*/return 0;/*- 填写目录项strcpy(cur_dir-directitemi.n ame ,n ame);int mkdir(char *n ame)int i,j;cur_dir-directitemi.firstd isk=j;cur_dir-directitemi.size=ROOT_DISK_SIZE;struct direct *cur_mkdir;if(!strcmp( name,.)return(-4);cur_dir-directitemi. next=jif(!strcmp( name,
24、.)return(-4);Jcur_per ty=1;if(strle n(n ame)8) /*- 如果目/*-所创目录在虚拟磁盘上的地址 (内录名长度大于8位-*/存物理地址 -*/return(-1);)cur_mkdir=(structdirect*)(fdisk+cur_dir-directitemi.firstdisk*DISKSIZE);for(i=2;idirectitemi.firstdisk=-1)cur_mkdir-directitem0.sig n =0;cur_mkdir-directitem0.firstdisk=cur_dir
25、-directitemi.fir stdisk;strcpy(cur_mkdir-directitem0. name,.);cur_mkdir-directitem0. next=cur_mkdir-directitem0.firstd isk;cur_perty=1;break;if(i=MSD+2) /*-目录/文件已满-*/return(-2);for(j=2;jdirectitem0.sizeif(!strcmp(cur_dir-directitemj. name, name)break;=ROOT_DISK_SIZE;/*-指向上一级目录的目
26、录项-*/cur_mkdir-directitem1.sig n=cur_dir-directitemO.sig n;cur_mkdir-directitem1.firstdisk=cur_dir-directitemO.fir stdisk;strcpy(cur_mkdir-directitem1. name,.);if(jMSD+2) /*- 如果有重名-*/return(-3);for(j=ROOT_DISK_NO+1;jdirectitem1. next=cur_mkdir-directitem1.firstdisk;if(i=MSD+2) /*- 没有这个文件或目录-*/return
27、(-1);cur_perty=1;cur_mkdir-directitem1.size=ROOT_DISK_SIZE;if(cur_perty!=1)/*- 删除的不是目录-*/return(-3);for(i=2;idirectitemi. next*DISKSIZE);directcur_mkdir-directitemi.sig n=0;for(j=2;jdirectitemi.firstdisk=-1;if(temp_dir-directitemj. ne xt!=-1)break;strcpy(cur_m
28、kdir-directitemi. name,);if(jdirectitemi. next=-1;/*- 找到起始盘块号并将其释放 -*/item=cur_dir-directitemi.f irstdisk;fatitem.em_disk=0;cur_perty=0;/*-修改目录项-*/cur_mkdir-directitemi.size=0;cur_dir-directitemi.sig n=0Jcur_dir-directitemi.firstd isk=-1;strcpy(cur_dir-directitemireturn 0;.n ame
29、,);cur_dir-directitemi. next=-int rmdir(char *n ame);cur_per ty=0;cur_dir-directitemi.size=Oint i,j,item;struct direct *temp_dir;/*-检查当前目录项中有无该目录J-*/return 0;for(i=2;idirectitemi. name, name)break;int i;for(i=2;idirectitemi.fir stdisk!=-1)/*-如果存在子目录-*/for(j=0;jdirect );i
30、f(!strcmp(temp_dir-directit ,temp)break;if(cur_perty=0) /*- 文件-*/prin tf(%dttn,cur_dir-difree(temp);/* 释放申请的临时空间*/if(temp_dir-directitemj.rectitemi.size);elseprintf(t=MSD+2) /*- 不在当前目录 -*/录 tn);return(-1);item=temp_dir-directitemj.firstdisk;/*-当前目录在磁盘中位置-*/int cd(char *n a
31、me)temp_dir=(structdirect*)(fdisk+item*DISKSIZE);int i,j,item;char *str;char *temp,*po in t,*po in t1; structdirect *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;idirectite
32、mj-1.sig n!=1) /*- 如果上级目录不是根目录-*/文 件统*计说明更改、* n);prin tf(*t 命令格式poi nt=strchr(bufferdir,);*n);/查找字符串bufferdir中首次出现prin tf(*tcd目录名字符的位置当前目录*n);prin tf(*tmkdir目录名*n);目录名*n);while(poi nt!=NULL)创建子目录prin tf(*trmdir删除子目录prin tf(*tdirpoint仁point+1; /*- 减,去所占的空间 记录下次查找的 起始地址-*/显示当前目录的子目录 *n);prin文件名*n);文件名
33、*n);tf(*tcreatepoi nt=strchr(poi nt1,);创建文件prin tf(*tdel删除文件*(poi nt1-1)=O;/*-将上一级目录删除-*/prin tf(*tope n文件名*n);打开文件prin tf(*tclose 文件名关闭文件prin tf(*tread*n);读文写文退出else*n);prin tf(*twrite*n);件件if(n ame0 !=)bufferdir=prin tf(*texitstrcat(bufferdir,); /*-修改当系统*n);前目录-*/bufferdir= *strcat(bufferdir, name
34、);*n)cur_dir=temp_dir; /*-将当前 目录确void mai n()定下来-*/return 0;FILE *fp; char ch;void show()prin tf(%s,bufferdir);*char a100;while(1)char code1110;char n ame10;int i,flag,r_size;char *con tect;sca nf(%s,a);for(i=0;i11;i+)if(!strcmp(codei,a) break;con tect=(char*)malloc(MAX_WRITE*sizeof(char)switch(i)Jc
35、ase 0: /退出文件系统 free(coif(fp=fopen( disk.dat,rb) )=NULL)ntect); halt(); return;case 1: / 创建文件prin tf(You have not format,Doyou want format?(y/n); scanf(%c,&ch);sca nf(%s, name); flag =create( name);if(flag=-1) prin tf(Error:nif(ch=y)The length is too long !n); else if(flag=-2)in itfile();prin tf(Succ
36、essfullyformat! n);prin tf(Error:The direct item is already full !n);n else if(flag=-3)elseprin tf(Error:nreturn;The number of openfile is too much !n); else if(flag=-4)prin tf(Error:The name is already in the direct !n);nen ter();prin t();show();else if(flag=-5)strcpy(code0,exit);strcpy(code1,creat
37、e);strcpy(code2,ope n);strcpy(code3,close);strcpy(code4,write);strcpy(code5,read); strcpy(code 6,del);strcpy(code7,mkdir);strcpy(code8,rmdir);strcpy(code9,dir);strcpy(code10,cd);prin tf(Error:The disk space is full! n);nshow();break;Icase 3:/关闭文件elseprin tf(Successfully createfile! n);aprin tf(Error
38、:nThe file is not ope ned ! n”);show();break;elsefcase 2:/打开文件sca nf(%s, name);prin tf(Successfullyclosefd = ope n(n ame);n);if(fd = -1)show();prin tf(Error:nnnbreak;The ope n file not exit! n ”);case 4:/写文件else if(fd = -2)prin tf(Error:The file have already opened! n”);else if(fd = -3)elseprin tf(E
39、rror:prin tf(PleaseThe number of open file is too much! in put the file con tect:);n);scan f(%s,co ntect);else if(fd = -4)flag=write(fd ,con tect,strle n(n con tect);prin tf(Error:It is a direct,can not open foror write! n);readif(flag = 0)prin tf(Successfullyelsewriten);prin tf(Successfullyope ned!
40、elsen);prin tf(Error:n The disk size is notprin tf(Successfullydelete!eno ugh! n”);n); show(); break; show(); break;case 7:/ 创建子目录 scanf(%s, name); flag =mkdir( name);case 5:/读文件if(fd =-1)if(flag = -1) printf(Error:nprin tf(Error:nThe length of nameis to long! n); else if(flag = -2)The file is not ope ned ! n”); elseprin tf(Error:nThe direct item is already full !n);flagread(fd,c on tect);if(flag = 0) else if(flag = -3)for(i=0;iu_ope ntable.ope nitemfd.siz
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供热管网施工组织设计
- 客厅智能照明系统设计与实现
- 和美乡村建设典型经验材料
- 全球医疗模拟行业市场分析:市场收入约为957.7百万美元
- 【市优】卖炭翁学习课件
- 《花格子大象艾玛》幼儿园小学少儿美术教育绘画课件创意教程教案
- 记账实操-干洗店账务处理分录
- 陕西省延安市第一中学2025届高三化学第十一次质量检测试题含解析
- 部编版一年级道德与法治下册教案全册
- 《朝花夕拾》知识点梳理(解析版)
- DB14T2796-2023检验检测机构综合能力建设自我声明诚信公开指南
- 2023年山西省太原市迎泽区小升初数学试卷
- WPSOffice办公软件应用PPT完整全套教学课件
- 林业基础知识考试复习题库(浓缩500题)
- 战略咨询院创新发展政策研究所项目聘用人员招考聘用笔试参考题库附答案解析
- Unit+1+Lesson+1+Lifestyles 高中英语北师大版必修第一册
- 电场考试题库多选题(含答案)
- (完整)读歌词猜歌名
- 村庄基本情况调查表
- “双减”下小学音乐教学改革策略探究 论文
- 种子粘贴画课件
评论
0/150
提交评论