#includestdio.h#includememory.h#includestring#includeiostreamusingnamespacestd;#defineGENERAL1//1代表普通文件2代表目录文件0表示空文件#defineDIRECTORY2#defineZero0structFCB{charfname[16];//文件名chartype;//0空文件1目录文件2空文件intsize;//文件大小intfatherBlockNum;//当前的父目录盘块号intcurrentBlockNum;//当前的盘块voidinitialize(){strcpy(fname,\0);type=Zero;size=0;fatherBlockNum=currentBlockNum=0;}};constchar*FilePath=C:\\myfiles;/*常量设置*/constintBlockSize=512;//盘块大小constintOPEN_MAX=5;//能打开最多的文件数constintBlockCount=128;//盘块数constintDiskSize=BlockSize*BlockCount;//磁盘大小64KconstintFcbCount=BlockSize/sizeof(FCB);//目录文件的最多FCB数intOpenFileCount=0;//统计当前打开文件数目structOPENLIST//用户文件打开表{intfiles;//当前打开文件数FCBf[OPEN_MAX];//FCB拷贝OPENLIST(){files=0;for(inti=0;iOPEN_MAX;i++){f[i].fatherBlockNum=-1;//为分配打开f[i].type=GENERAL;}}};structdirFile/*-------------目录文件结构---------------*/{structFCBfcb[FcbCount];voidinit(int_FatherBlockNum,int_CurrentBlockNum,char*name)//父块号,当前块号,目录名{strcpy(fcb[0].fname,name);//本身的FCBfcb[0].fatherBlockNum=_FatherBlockNum;fcb[0].currentBlockNum=_CurrentBlockNum;fcb[0].type=DIRECTORY;//标记目录文件for(inti=1;iFcbCount;i++){fcb[i].fatherBlockNum=_CurrentBlockNum;//标记为子项fcb[i].type=Zero;//标记为空白项}}};structDISK/**********************************************************************/{intFAT1[BlockCount];//FAT1intFAT2[BlockCount];//FAT2structdirFileroot;//根目录chardata[BlockCount-3][BlockSize];voidformat(){memset(FAT1,0,BlockCount);//FAT1清零memset(FAT2,0,BlockCount);//FAT2清零FAT1[0]=FAT1[1]=FAT1[2]=-2;//0,1,2盘块号依次代表FAT1,FAT2,根目录区FAT2[0]=FAT2[1]=FAT2[2]=-2;//FAT作备份root.init(2,2,C:\\);//根目录区memset(data,0,sizeof(data));//数据区清零}};FILE*fp;//磁盘文件地址char*BaseAddr;//虚拟磁盘空间基地址stringcurrentPath=C:\\;//当前路径intcurrent=2;//当前目录的盘块号stringcmd;//输入指令structDISK*osPoint;//磁盘操作系统指针charcommand[16];//文件名标识structOPENLIST*openlist;//用户文件列表指针intformat();intmkdir(char*sonfname);intrmdir(char*sonfname);intcreate(char*name);intlistshow();intdelfile(char*name);intchangePath(char*sonfname);intwrite(char*name);intexit();intopen(char*file);intclose(char*file);intread(char*file);/*------------初始化-----------------------*/intformat(){current=2;currentPath=C:\\;//当前路径osPoint-format();//打开文件列表初始化deleteopenlist;openlist=newOPENLIST;/*-------保存到磁盘上myfiles--------*/fp=fopen(FilePath,w+);fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);printf(格式化成功!!\n);return1;}intmkdir(char*sonfname)/*-----------------------创建子目录-------------------*/{//判断是否有重名、寻找空白子目录项、寻找空白盘块号、当前目录下增加该子目录项、分配子目录盘块并且初始化、修改fat表inti,temp,iFAT;structdirFile*dir;//当前目录的指针if(current==2)//根目录dir=&(osPoint-root);elsedir=(structdirFile*)(osPoint-data[current-3]);/*--------为了避免该目录下同名文件夹--------*/for(i=1;iFcbCount;i++){if(dir-fcb[i].type==DIRECTORY&&strcmp(dir-fcb[i].fname,sonfname)==0){printf(该文件夹下已经有同名的文件夹存在了!\n);return0;}}for(i=1;iFcbCount;i++){//查找空白fcb序号if(dir-fcb[i].type==Zero)break;}if(i==FcbCount){printf(该目录已满!请选择新的目录下创建!\n);return0;}temp=i;for(i=3;iBlockCount;i++){if(osPoint-FAT1[i]==0)break;}if(i==BlockCount){printf(磁盘已满!\n);return0;}iFAT=i;/*-------------接下来进行分配----------*/osPoint-FAT1[iFAT]=osPoint-FAT2[iFAT]=2;//2表示分配给下级目录文件//填写该分派新的盘块的参数strcpy(dir-fcb[temp].fname,sonfname);dir-fcb[temp].type=DIRECTORY;dir-fcb[temp].fatherBlockNum=current;dir-fcb[temp].currentBlockNum=iFAT;//初始化子目录文件盘块dir=(structdirFile*)(osPoint-data[iFAT-3]);//定位到子目录盘块号dir-init(current,iFAT,sonfname);//iFAT是要分配的块号,这里的current用来指要分配的块的父块号printf(创建子目录成功!\n);return1;}intrmdir(char*sonfname)/*-------删除当前目录下的文件夹--------*/{inti,temp,j;//确保当前目录下有该文件,并记录下该FCB下标structdirFile*dir;//当前目录的指针if(current==2)dir=&(osPoint-root);elsedir=(structdirFile*)(osPoint-data[current-3]);for(i=1;iFcbCount;i++){//查找该目录文件if(dir-fcb[i].type==DIRECTORY&&strcmp(dir-fcb[i].fname,sonfname)==0){break;}}temp=i;if(i==FcbCount){printf(当前目录下不存在该子目录!\n);return0;}j=dir-fcb[temp].currentBlockNum;structdirFile*sonDir;//当前子目录的指针sonDir=(structdirFile*)(osPoint-data[j-3]);for(i=1;iFcbCount;i++){//查找子目录是否为空目录if(sonDir-fcb[i].type!=Zero){printf(该文件夹为非空文件夹,为确保安全,请清空后再删除!\n);return0;}}/*开始删除子目录操作*/osPoint-FAT1[j]=osPoint-FAT2[j]=0;//fat清空char*p=osPoint-data[j-3];//格式化子目录memset(p,0,BlockSize);dir-fcb[temp].initialize();//回收子目录占据目录项printf(删除当前目录下的文件夹成功\n);return1;}/*-----------在当前目录下创建文本文件---------------*/intcreate(char*name){inti,iFAT;//temp,intemptyNum=0,isFound=0;//空闲目录项个数structdirFile*dir;//当前目录的指针if(current==2)dir=&(osPoint-root);elsedir=(structdirFile*)(osPoint-data[current-3]);for(i=1;iFcbCount;i++)//查看目录是否已满//为了避免同名的文本文件{if(dir-fcb[i].type==Zero&&isFound==0){emptyNum=i;isFound=1;}elseif(dir-fcb[i].type==GENERAL&&strcmp(dir-fcb[i].fname,name)==0){printf(无法在同一目录下创建同名文件!\n);return0;}}if(emptyNum==0){printf(已经达到目录项容纳上限,无法创建新目录!\n);return0;}for(i=3;iBlockCount;i++)//查找FAT表寻找空白区,用来分配磁盘块号j{if(osPoint-FAT1[i]==0)break;}if(i==BlockCount){printf(磁盘已满!\n);return0;}iFAT=i;/*------进入分配阶段---------*///分配磁盘块osPoint-FAT1[iFAT]=osPoint-FAT2[iFAT]=1;/*-----------接下来进行分配----------*///填写该分派新的盘块的参数strcpy(dir-fcb[emptyNum].fname,name);dir-fcb[emptyNum].type=GENERAL;dir-fcb[emptyNum]