logo资料库

简单文件系统实现.doc

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
1、实验目的: 掌握文件系统的工作 2、实验要求 (1)编译执行模拟文件系统的实现程序,根据系统实现的功能反复操作,直至熟悉所有 功能。在磁盘上建立一个文件作为文件存储器,此文件相当于一个磁盘分区,并在其上实现 一个简单的单用户文件系统。 (2) 根据代码分析文件系统的磁盘结构、文件目录结构的形式、文件 FCB 各项的含义以 及空闲空间管理的方法。 (3)) 对文件系统的功能实现给出分析描述,并画出流程图,要求分析的功能有:  format:对文件系统进行格式化。  dir:显示文件。  create:建立文件。  write:写文件。wf filename size  read: 读文件。rf filename start size  del: 删除文件。df filename 3、实验环境 windows 环境
4、实验内容 分析模拟文件系统的实现程序,对文件的基本管理数据结构和有关实现过程给出分析, 并画出流程图。 5、程序源代码: #include #include #include /*1M 磁盘空间*/ /*磁盘快的大小 1K*/ /*路径最长可达 100 字节*/ /*写入文字可达 128k 字节*/ /*最大子目录数 5 (类似五叉树)*/ #define DIR_LENGTH 1024 #define MAX_WRITE 1024*128 #define MEM_D_SIZE 1024*1024 #define DISKSIZE 1024 #define MSD 5 #define DISK_NUM MEM_D_SIZE/DISKSIZE /*磁盘快数目 1024=1M/1K*/ #define FATSIZE DISK_NUM*sizeof(struct fatitem) /*FAT 表大小 8K=8192B (理想应该 是 1.5K)*/ #define MOFN 5 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /*根目录起始盘快号 9*/ #define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/ /*最大文件打开数 5 (即除根以外最大深度为 5)*/ /*---------------FAT 表项结构-----------------------*/ struct fatitem /* size 8*/ { int item; char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ }; /*存放文件下一个磁盘的指针*/ /*-------------------目录项结构------------------------*/ struct direct { /* size 196*/
/*-----文件控制快信息-----*/ struct FCB { char name[9]; char property; int size; int firstdisk; int next; int sign; /*文件/目录名 8 位*/ /*属性 1 位目录 0 位普通文件*/ /*文件/目录字节数(原注释位盘块数)*/ /*文件/目录 起始盘块号*/ /*子目录起始盘块号*/ /*1 是根目录 0 不是根目录*/ }directitem[MSD+2]; }; /*------------------文件打开表项结构--------------------------*/ struct opentable /* size 104*/ { struct openttableitem /* size 20*/ { /*文件的大小*/ char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; }openitem[MOFN]; int cur_size; }; /*当前打文件的数目*/ /*FAT 表*/ /*根目录*/ /*-------------------------------------------------------------------*/ struct fatitem *fat; struct direct *root; struct direct *cur_dir; struct opentable u_opentable; /*文件打开表*/ int char *bufferdir; char *fdisk; /*记录当前路径的名称*/ /*虚拟磁盘起始地址*/ fd=-1; /*文件打开表的序号*/ /*当前目录*/ 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 int del(char *name); int mkdir(char *name); int rmdir(char *name); void dir(); int cd(char *name); void print(); void show(); read(int fd,char *buf); /*----------------------------------------------------------------------------------------------*/ /*------------------------------------------初始化文件系统--------------------------------------*/ void initfile() { fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M 空间*/ format(); free(fdisk); } /*----------------------------------------------------------------------------------------------*/ /*------------------------------------------格式化----------------------------------------------*/ void format() { int i; FILE *fp; fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算 FAT 表地址(为什么向后偏移 1k)*/ /*-----初始化 FAT 表------------*/ fat[0].item=-1; /*引导块*/
fat[0].em_disk='1'; for(i=1;idirectitem[0].sign = 1; root->directitem[0].firstdisk = ROOT_DISK_NO; strcpy(root->directitem[0].name,"."); root->directitem[0].next = root->directitem[0].firstdisk; root->directitem[0].property = '1'; root->directitem[0].size = ROOT_DISK_SIZE; /*-------指向上一级目录的目录项---------*/ root->directitem[1].sign = 1; root->directitem[1].firstdisk = ROOT_DISK_NO; strcpy(root->directitem[1].name,".."); root->directitem[1].next = root->directitem[0].firstdisk; root->directitem[1].property = '1'; root->directitem[1].size = ROOT_DISK_SIZE;
for(i=2;idirectitem[i].sign = 0; root->directitem[i].firstdisk = -1; strcpy(root->directitem[i].name,""); root->directitem[i].next = -1; root->directitem[i].property = '0'; root->directitem[i].size = 0; } /*-------测试写入文件的数据--------- for(i=0;idirectitem[i].firstdisk, root->directitem[i].name,root->directitem[i].next, root->directitem[i].property,root->directitem[i].sign, root->directitem[i].size); } for(i=0;idirectitem[i],sizeof(struct FCB),1,fp); printf("%d,%s,%d,%c,%d,%d/n",root->directitem[i].firstdisk, root->directitem[i].name,root->directitem[i].next, root->directitem[i].property,root->directitem[i].sign, root->directitem[i].size);
} ------test end-----*/ 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 file/n"); return; } if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁盘文件 disk.dat 读入虚拟磁盘空间(内存)*/ { } printf("Error:/nCannot read file/n"); exit(0); fat = (struct fatitem *)(fdisk+DISKSIZE); root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/ /*找到 FAT 表地址*/
fclose(fp); /*--------------初始化用户打开表------------------*/ for(i=0;i
分享到:
收藏