1、exit系统执行流程图3详细设计主要数据结构:#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 102
2、4 /路径最大长度为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; /
3、*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录 起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录 0不是根目录*/ directitemMSD+2;struct opentable struct openttableitem /*文件名*/ /*起始盘块号*/ /*文件的大小*/ openitemMOFN; int cur_size; /*当前打文件的数目*/ 管理文件的主要代码:int create(char *name) int i,j; if(strlen(name)8) /*文件名大于 8位*/ retur
4、n(-1); for(j=2;jdirectitemj.name,name) break; if(jMSD+2) /*文件已经存在*/ return(-4); for(i=2;idirectitemi.firstdisk=-1) if(i=MSD+2) /*无空目录项*/ return(-2); if(u_opentable.cur_size=MOFN) /*打开文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;DISK_NUM;j+) /*找到空闲盘块 j 后退出*/ if(fatj.em_disk=0) break; if(j=DISK_NUM) return
5、(-5); fatj.em_disk = 1; /*将空闲块置为已经分配*/ /*-填写目录项-*/ strcpy(cur_dir-directitemi.name,name); cur_dir-directitemi.firstdisk = j;directitemi.size = 0;directitemi.next = j;directitemi.property = /*-*/ fd = open(name); return 0; int open(char *name) int i, j;i+) /*文件是否存在*/ directitemi.name,name) =MSD+2) /*
6、-是文件还是目录-*/ if(cur_dir-directitemi.property=) /*-文件是否打开-*/ for(j=0;MOFN;j+) strcmp(u_opentable.openitemj.name,name) MOFN) /*文件已经打开*/ =MOFN) /*文件打开太多*/ /*-查找一个空闲用户打开表项-*/ if(u_opentable.openitemj.firstdisk=-1) /*-填写表项的相关信息-*/ u_opentable.openitemj.firstdisk = cur_dir-directitemi.firstdisk; strcpy(u_o
7、pentable.openitemj.name,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+) strcmp(u_opentable.openitemi.name,name) =MOFN) /*-清空该文件的用户打开表项的内容-*/ strcpy(u_opentable.openitemi.name,); u_opentable.ope
8、nitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size-;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= nlen; if(bufi = $ bufi = Space; else if(bufi = # bufi = Endter;
9、/*-读取用户打开表对应表项第一个盘块号-*/ item = u_opentable.openitemfd.firstdisk; /*-找到当前目录所对应表项的序号-*/ directitemi.firstdisk=item) temp = i; /*-存放当前目录项的下标-*/ /*-找到的item 是该文件的最后一块磁盘块-*/ while(fatitem.item!=-1) item =fatitem.item; /*-查找该文件的下一盘块-*/ /*-计算出该文件的最末地址-*/ first = fdisk+item*DISKSIZE+u_opentable.openitemfd.si
10、ze%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;(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE
11、);/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/ firsti = buf i; /*-计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-*/ ilen1 = len-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE); ilen2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen0) ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/ for(j=0;ilen2; for(i=ROOT_DISK_NO+1;i+)/*寻找空闲磁盘块*/ if(fati.em
12、_disk= break; if(i=DISK_NUM) /*-如果磁盘块已经分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一块-*/ for(k=0;kdirectitemcur_item.firstdisk;/*-该文件的起始盘块号-*/ while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = item = te
13、mp; /*-释放目录项-*/ directitemcur_item.sign = 0;directitemcur_item.firstdisk = -1; strcpy(u_opentable.openitemcur_item.name,directitemcur_item.next = -1;directitemcur_item.property = directitemcur_item.size = 0;主函数:int main() FILE *fp; char ch; char a100; char code1110; char name10; int i,flag,r_size; c
14、har *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 0; enter(); print(); show(); strcpy(code0,exit strcpy(code1,create strcpy(cod
15、e2,open strcpy(code3,close strcpy(code4,write strcpy(code5,read strcpy(code6,del strcpy(code7,mkdir strcpy(code8,rmdir strcpy(code9,dir strcpy(code10,cd while(1) %s,a);11; if(!strcmp(codei,a) break; switch(i) case 0: /退出文件系统 free(contect); halt(); case 1: /创建文件 scanf(,name); flag = create(name); if(
16、flag=-1) printf(Error: n The length is too long !n else if(flag=-2) n The direct item is already full ! else if(flag=-3) n The number of openfile is too much ! else if(flag=-4) n The name is already in the direct ! else if(flag=-5) n The disk space is full! else Successfully create a file! show(); case 2:/打开文件 fd = open(name); if(fd = -1) n The open file not exit! else if(fd = -2) n The file have