版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统文件管理系统模拟实验 文件管理系统模拟1.实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2.实验内容为Linux系统设计一个简单的二级文件系统。要求做到以下几点:(1)可以实现下列几条命令(至少4条)login用户登录dir列文件目录create创建文件delete删除文件open打开文件close关闭文件read读文件write写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。3.实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
2、(2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2并以编号作为物理地址,在目录中进行登记。4.源代码15#include<> #include<> #include<> #define MEM_D_SIZE 1024*1024 tem=-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.item=-1
3、; /*存放根目录的磁盘块号*/ 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->directitem0.firstdisk = ROOT_DI
4、SK_NO; strcpy(root->,"."); root->directitem0.next = root->directitem0.firstdisk; root->perty = '1' root->directitem0.size = ROOT_DISK_SIZE; /*-指向上一级目录的目录项-*/ root->directitem1.sign = 1; root->directitem1.firstdisk = ROOT_DISK_NO;
5、strcpy(root->,"."); root->directitem1.next = root->directitem0.firstdisk; root->perty = '1' root->directitem1.size = ROOT_DISK_SIZE; if(fp = fopen("","wb")=NULL) printf("Error:n Cannot open file n"); return
6、; for(i=2;i<MSD+2;i+) /*-子目录初始化为空-*/ root->directitemi.sign = 0; root->directitemi.firstdisk = -1; strcpy(root->,""); root->directitemi.next = -1; root->perty = '0' root->directitemi.size = 0; if(fp = fopen("","wb&q
7、uot;)=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(""
8、,"rb")=NULL) printf("Error:nCannot open filen"); return; if(!fread(fdisk,MEM_D_SIZE,1,fp) /*把磁盘文件 读入虚拟磁盘空间(内存)*/ printf("Error:nCannot read filen"); exit(0); fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地
9、址*/ fclose(fp); /*-初始化用户打开表-*/ for(i=0;i<MOFN;i+) ,""); i.firstdisk = -1; i.size = 0; = 0; cur_dir = root; /*当前目录为根目录*/ bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char); strcpy(bufferdir,"Root:"); void halt() FILE *fp; int i; if(fp=fopen("","wb&qu
10、ot;)=NULL) printf("Error:nCannot open filen"); return; if(!fwrite(fdisk,MEM_D_SIZE,1,fp) /*把虚拟磁盘空间(内存)内容读入磁盘文件 */ printf("Error:nFile write error!n"); fclose(fp); free(fdisk); free(bufferdir); return;int create(char *name) int i,j; if(strlen(name)>8) /*文件名大于 8位*/ return(-1); f
11、or(j=2;j<MSD+2;j+) /*检查创建文件是否与已存在的文件重名*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*文件已经存在*/ return(-4); for(i=2;i<MSD+2;i+) /*找到第一个空闲子目录*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*无空目录项*/ return(-2); if>=MOFN) /*打开文件太多*/ return(-3); for(j
12、=ROOT_DISK_NO+1;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->
13、directitemi.next = j; cur_dir->perty = '0' /*-*/ 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); /*-是文件还是目录-*/ if(cur_dir->perty=
14、39;1')return(-4); /*-文件是否打开-*/ for(j=0;j<MOFN;j+) if(!,name) break; if(j<MOFN) /*文件已经打开*/ return(-2); if>=MOFN) /*文件打开太多*/ return(-3); /*-查找一个空闲用户打开表项-*/ for(j=0;j<MOFN;j+) ifj.firstdisk=-1) break; /*-填写表项的相关信息-*/ j.firstdisk = cur_dir->directitemi.firstdisk; strcpyj.n
15、ame,name); j.size = cur_dir->directitemi.size; +; /*-返回用户打开表表项的序号-*/ return(j); int close(char *name) int i; for(i=0;i<MOFN;i+) if(!,name) break; if(i>=MOFN) return(-1); /*-清空该文件的用户打开表项的内容-*/ ,""); i.firstdisk = -1; i.size = 0; ; return 0; int write(int fd,
16、 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;i<len;i+) if(bufi = '$') bufi = Space; else if(bufi = '#') bufi = Endter; /*-读取用户打开表对应表项第一个盘块号-*/ item = fd.firstdisk;
17、/*-找到当前目录所对应表项的序号-*/ for(i=2;i<MSD+2;i+) if(cur_dir->directitemi.firstdisk=item) break; temp = i; /*-存放当前目录项的下标-*/ /*-找到的item 是该文件的最后一块磁盘块-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找该文件的下一盘块-*/ /*-计算出该文件的最末地址-*/ first = fdisk+item*DISKSIZE+fd.size%DISKSIZE; /*-如果最后磁盘块剩余的大小大于要写入的文件的大小-
18、*/ iffd.size%DISKSIZE>len) strcpy(first,buf); fd.size = fd.size+len; cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len; else for(i=0;i<fd.size%DISKSIZE);i+) /*写一部分内容到最后一块磁盘块的剩余空间(字节)*/ firsti = buf i; /*-计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-*/ ilen1 = len-fd.size%DISKSIZE); ilen
19、2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen>0) ilen2 = 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; /*-找到的那块空闲磁盘块的起始地址-*/
20、if(j=ilen2-1) /*-如果是最后要分配的一块-*/ for(k=0;k<len-fd.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 (即没有下一块)-*/ /*-修
21、改长度-*/ fd.size = fd.size+len; cur_dir->directitemtemp.size = cur_dir->directitemtemp.size+len; return 0; int read(int fd, char *buf) int len = fd.size; char *first; int i, j, item; int ilen1, modlen; item = fd.firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+
22、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 = firstj; else /*-不在最后一块磁盘块-*/ for(j=0;j<len-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; item = fatitem.item; /*-查找下一盘块-*/ first = f
23、disk+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) break; cur_item = i; /*-用来保存目录项的序号,供释放目录中-*/ if(i>=MSD+2) /*-如果不在当前目录中-*/ return(-1); if(cur_dir->directitemcur_perty!=
24、'0') /*-如果删除的(不)是目录-*/ return(-3); for(i=0;i<MOFN;i+) /*-如果文件打开,则不能删除,退出-*/ if(!,name) return(-2); item = cur_dir->directitemcur_item.firstdisk;/*-该文件的起始盘块号-*/ while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = '0' item
25、 = temp; /*-释放目录项-*/ cur_dir->directitemcur_item.sign = 0; cur_dir->directitemcur_item.firstdisk = -1; strcpycur_,""); cur_dir->directitemcur_item.next = -1; cur_dir->directitemcur_perty = '0' cur_dir->directitemcur_item.size = 0; return 0; int mkdir
26、(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;i<MSD+2;i+) /*-如果有空闲目录项退出-*/ if(cur_dir->directitemi.firstdisk=-1) break; if(i>=MSD+2) /*-目录/文件
27、已满-*/ return(-2); for(j=2;j<MSD+2;j+) /*-判断是否有重名-*/ if(!strcmp(cur_dir->,name) break; if(j<MSD+2) /*-如果有重名-*/ return(-3); for(j=ROOT_DISK_NO+1;j<DISK_NUM;j+) /*-找到空闲磁盘块 j 后退出-*/ if(fatj.em_disk='0') break; if(j>=DISK_NUM) return(-5); fatj.em_disk='1' /*
28、-将该空闲块设置为已分配-*/ /*-填写目录项-*/ strcpy(cur_dir->,name); cur_dir->directitemi.firstdisk=j; cur_dir->directitemi.size=ROOT_DISK_SIZE; cur_dir->directitemi.next=j; cur_dir->perty='1' /*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir-
29、>directitemi.firstdisk*DISKSIZE); /*-初始化目录-*/ /*-指向当前目录的目录项-*/ cur_mkdir->directitem0.sign=0; cur_mkdir->directitem0.firstdisk=cur_dir->directitemi.firstdisk; strcpy(cur_mkdir->,"."); cur_mkdir->directitem0.next=cur_mkdir->directitem0.firstdisk; cur_mkd
30、ir->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_mkdir->,"."); cur_mkdir-
31、>directitem1.next=cur_mkdir->directitem1.firstdisk; cur_mkdir->perty='1' cur_mkdir->directitem1.size=ROOT_DISK_SIZE; for(i=2;i<MSD+2;i+) /*-子目录都初始化为空-*/ cur_mkdir->directitemi.sign=0; cur_mkdir->directitemi.firstdisk=-1; strcpy(cur_mkdir->directitemi.na
32、me,""); cur_mkdir->directitemi.next=-1; cur_mkdir->perty='0' cur_mkdir->directitemi.size=0; return 0; int rmdir(char *name) int i,j,item; struct direct *temp_dir; /*-检查当前目录项中有无该目录-*/ for(i=2;i<MSD+2;i+) if(!strcmp(cur_dir->,name) break;
33、 if(i>=MSD+2) /*-没有这个文件或目录-*/ return(-1);if(cur_dir->perty!='1')/*-删除的不是目录-*/ return(-3); /*-判断要删除的目录有无子目录-*/ temp_dir=(struct direct *)(fdisk+cur_dir->directitemi.next*DISKSIZE); for(j=2;j<MSD+2;j+) if(temp_dir->directitemj.next!=-1) break; if(j<MSD+2) /*-有子
34、目录或文件-*/ return(-2); /*-找到起始盘块号,并将其释放-*/ item=cur_dir->directitemi.firstdisk; fatitem.em_disk='0' /*-修改目录项-*/ cur_dir->directitemi.sign=0; cur_dir->directitemi.firstdisk=-1; strcpy(cur_dir->,""); cur_dir->directitemi.next=-1; cur_dir->perty='0' cur_dir->directitemi.size=0; return 0; void dir() int i; for(i=2;i<MSD+2;i+) if(cur_dir->directitemi.firstdisk!=-1) /*-如果存在子目录-*/ printf("%st",cur_dir->); if(cur_dir->perty='0') /*-文件-*/ printf("%dttn"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训课件教学课件
- 医疗废物管理知识培训讲座
- 水上交通安全管理
- 《中国糖尿病防治指南(2024版)》更新要点解读
- 2018年中国在线导购行业研究报告简版
- 管理学经典案例-塞氏企业无为而治理念
- 城市规划设计与绿色环保
- 草原五下教学课件教学课件教学
- 新产品需求评估申请表
- 颅脑损伤的护理教学
- 福建省划拨土地使用权管理办法
- 【小学生网络成瘾的不良影响及其对策4800字(论文)】
- 《奇效的敷脐疗法》
- 《西安长安区停车难问题研究【开题报告+正文】》15000字
- FMEA第五版表格(带实例)
- 汽车4S店安全标准化之隐患排查与治理制度
- 《古兰》中文译文版
- NBT47013-2015承压设备无损检测
- GB/T 2794-2022胶黏剂黏度的测定
- GB/T 4744-2013纺织品防水性能的检测和评价静水压法
- 【省级公开课】高中英语读后续写训练课件Read,Design and Write
评论
0/150
提交评论