1、操作系统 文件存储空间管理 位示图法#include #include #include #include using namespace std;struct FCB char fname16; /文件名 int type; /1代表普通文件2代表目录文件0表示空文件 int size; /文件大小 int fatherBlockNum; /当前的父目录盘块号 int firstBlockNum; /该文件第一个盘块号 int currentBlockNum; /当前的盘块 int lastBlockNum; void initialize() strcpy(fname,0); type =
2、 0; size =0; fatherBlockNum = firstBlockNum = currentBlockNum =lastBlockNum= 0; ;/*常量设置*/const char* FilePath = C:myfiles;const int BlockSize = 512; /盘块大小(可配置)const int OPEN_MAX = 5; /能打开最多的文件数const int BlockCount = BlockSize/sizeof(int); /盘块数const int DiskSize = BlockSize*BlockCount; /磁盘大小const int
3、 BlockFcbCount = BlockSize/sizeof(FCB);/目录文件的最多FCB数const int m=16; /位示图的列数 const int n=BlockCount/m; /位示图的行数/const int IOBUF_SIZE = 512;/char IOBufferIOBUF_SIZE; int OpenFileCount = 0;struct OPENLIST /用户文件打开表 int files; /当前打开文件数 FCB fOPEN_MAX; /FCB拷贝 OPENLIST() files=0; for(int i=0;iOPEN_MAX;i+) fi.
4、fatherBlockNum=-1;/为分配打开 fi.type=0; ;/*-目录文件结构-*/struct dirFile struct FCB fcbBlockFcbCount; void init(int _FatherBlockNum,int _FirstBlockNum, int _CurrentBlockNum,int _LastBlockNum,char *name)/父块号,第一个盘块号,当前块号,目录名 strcpy(fcb0.fname,name); /本身的FCB fcb0.fatherBlockNum=_FatherBlockNum; fcb0.firstBlockN
5、um=_FirstBlockNum; fcb0.currentBlockNum=_CurrentBlockNum; fcb0.lastBlockNum=_LastBlockNum; fcb0.type=2; /标记目录文件 for(int i=1;iBlockFcbCount;i+) fcbi.fatherBlockNum=_CurrentBlockNum; /标记为子项 fcbi.type=0; / 标记为空白项 ;/*/struct DISK int FAT1BlockCount; /FAT1 int FAT2BlockCount; /FAT2 struct dirFile root; /
6、根目录 int mapnm; /位示图,最初都为0 int checknm; /check数组用于一致性检查,作为数据计数器; char dataBlockCount-5BlockSize; void format() memset(FAT1,0,BlockCount); /FAT1 memset(FAT2,0,BlockCount); /FAT2 FAT10=FAT11=FAT12=FAT13=FAT14=-2; /0,1,2盘块号依次代表FAT1,FAT2,根目录区 FAT20=FAT21=FAT22=FAT23=FAT24=-2; /FAT作备份 root.init(2,2,2,2,G:
7、);/根目录区 for(int i=0;i=BlockCount;i+) /map00,map01,map01,map02,map03,map04以及check /对应位置为占用 if(iformat();/打开文件列表初始化 delete openlist; openlist=new OPENLIST; /*-保存到磁盘上myfiles-*/ fp = fopen(FilePath,w+); fwrite(BaseAddr,sizeof(char),DiskSize,fp); fclose(fp); printf(-nn); return 1;/*-创建子目录-*/int mkdir(cha
8、r *sonfname) /判断是否有重名 /寻找空白子目录项 /寻找空白盘块号 /当前目录下增加该子目录项 /分配子目录盘块,并且初始化 /修改fat表 int i,temp,iFAT; struct dirFile *dir; /当前目录的指针 if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-5); /*-为了避免该目录下同名文件夹-*/ for(i = 1;ifcbi.type=2 & strcmp(dir-fcbi.fname,sonfname)=0 ) printf
9、(该文件夹下已经有同名的文件夹存在了!n); return 0; /查找空白fcb序号 for(i=1;ifcbi.type=0) break; if(i=BlockFcbCount) printf(该目录已满!请选择新的目录下创建!n); return 0; temp=i; for(i = 5;i mapi/mi%m 0) break; if(i = BlockCount) printf(磁盘已满!n); return 0; iFAT=i; /*-接下来进行分配-*/ osPoint-mapiFAT/miFAT%m-; /对应盘块在位示图置0; osPoint-FAT1iFAT=osPoin
10、t-FAT2iFAT= iFAT; /每个目录文件只占一块 所以在文件分配表中其链接的下一块为其本身 osPoint-checkiFAT/miFAT%m+; /对应盘块在数据计数器中置1; /填写该分派新的盘块的参数 strcpy(dir-fcbtemp.fname,sonfname); dir-fcbtemp.type=2; dir-fcbtemp.fatherBlockNum=current; dir-fcbtemp.firstBlockNum=iFAT; dir-fcbtemp.currentBlockNum=iFAT; dir-fcbtemp.lastBlockNum=iFAT; /初
11、始化子目录文件盘块 dir=(struct dirFile*)(osPoint-data iFAT-5); /定位到子目录盘块号 dir-init (current,iFAT,iFAT,iFAT,sonfname);/iFAT是要分配的块号,这里的current用来指要分配的块的父块号 printf(-nn); return 1;/*-删除当前目录下的文件夹-*/int rmdir(char *sonfname) /if(子目录不存在) return error /if(子目录不是空文件夹) return error /回收子目录磁盘块号b(修改fat) /回收子目录占据目录项 int i,t
12、emp,j;/确保当前目录下有该文件,并记录下该FCB下标 struct dirFile *dir; /当前目录的指针 if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-5); for(i=1;ifcbi.type=2 & strcmp(dir-fcbi.fname,sonfname)=0) break; temp=i; if(i=BlockFcbCount) printf(当前目录下不存在该子目录!n); return 0; j = dir-fcbtemp.currentBl
13、ockNum; struct dirFile *sonDir; /当前子目录的指针 sonDir=(struct dirFile *)(osPoint-data j - 5); for(i=1;ifcbi.type!=0) printf(该文件夹为非空文件夹,为确保安全,请清空后再删除!n); return 0; /*开始删除子目录操作*/ osPoint-FAT1j = osPoint-FAT2j=0; /fat清空 osPoint-mapj/mj%m+; /位示图对应盘块置为空闲 osPoint-checkj/mj%m-; /数据计数器对应盘块置为空闲 char *p=osPoint-da
14、taj-5; /格式化子目录 memset(p,0,BlockSize); dir-fcbtemp.initialize(); /回收子目录占据目录项 printf(-nn); return 1; /*-在当前目录下创建文本文件-*/int create(char *name) int i,iFAT;/temp, int emptyNum = 0,isFound = 0; /空闲目录项个数 struct dirFile *dir; /当前目录的指针 if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-da
15、ta current-3); /查看目录是否已满 /为了避免同名的文本文件 for(i=1;ifcbi.type = 0 & isFound = 0) emptyNum = i; isFound = 1; else if(dir-fcbi.type=1 & strcmp(dir-fcbi.fname,name)=0 ) printf(无法在同一目录下创建同名文件!n); return 0; if(emptyNum = 0) printf(已经达到目录项容纳上限,无法创建新文件!n); return 0; /查找位示图寻找空白区,用来分配磁盘块号j for(i = 5;imapi/mi%m 0)
16、 break; if(i=BlockCount) printf(磁盘已满!n); return 0; iFAT=i; /*-进入分配阶段-*/位示图分配 osPoint-mapiFAT/miFAT%m-; /分配磁盘块 osPoint-FAT1iFAT = osPoint-FAT2iFAT = iFAT; /文件刚刚创建时只分配一块 FAT连接自身 /数据计数器对应位置为占用 osPoint-checkiFAT/miFAT%m+; /*-接下来进行分配-*/ /填写该分派新的盘块的参数 strcpy(dir-fcbemptyNum.fname,name); dir-fcbemptyNum.ty
17、pe=1; dir-fcbemptyNum.fatherBlockNum=current; dir-fcbemptyNum.firstBlockNum=iFAT; dir-fcbemptyNum.currentBlockNum=iFAT; dir-fcbemptyNum.lastBlockNum=iFAT; dir-fcbemptyNum.size =0; char* p = osPoint-dataiFAT -5; memset(p,#,BlockSize); printf(-nn); return 1;/*-查询子目录-*/int listshow() int i,DirCount=0,F
18、ileCount=0; /搜索当前目录 struct dirFile *dir; /当前目录的指针 if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-5); for(i=1;ifcbi.type=1) /查找普通文件 FileCount+; printf(%s 文本文件.n,dir-fcbi.fname); if(dir-fcbi.type=2) /查找目录文件 DirCount+; printf(%s 文件夹.n,dir-fcbi.fname); printf(n该目录下共有
19、 %d 个文本文件, %d 个文件夹nn,FileCount,DirCount); printf(-nn); return 1; /*-在当前目录下删除文件-*/int delfile(char *name) int i,temp,j; /确保当前目录下有该文件,并且记录下它的FCB下标 struct dirFile *dir; /当前目录的指针 if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-3); for(i=1;ifcbi.type=1 & strcmp(dir-fcb
20、i.fname,name)=0) break; if(i=BlockFcbCount) printf(当前目录下不存在该文件!n); return 0; /从打开列表中删除 close(name); printf(文件已删除!n); temp=i; /*开始删除文件操作*/ dir-fcb temp.currentBlockNum=dir-fcb temp.firstBlockNum; int next=dir-fcb temp.currentBlockNum ; /查找盘块号j do j = dir-fcb temp.currentBlockNum = next; next=osPoint-
21、FAT1j; osPoint-FAT1j=osPoint-FAT2j=0; /fat1,fat2表标记为空白 osPoint-mapj/mj%m+; /位示图该盘块号对应位置为空闲 osPoint-checkj/mj%m-; /数据计数器对应盘块号置为空闲 char *p=osPoint-dataj - 5; memset(p,0,BlockSize); /清除原文本文件的内容 while(dir-fcb temp.currentBlockNum!=dir-fcb temp.lastBlockNum); dir-fcbtemp.initialize(); /type=0; /标记该目录项为空文件 printf(-nn); return 1;/*-进入当前目录下的子目录-*/int changePath(char *sonfname) struct dirFile *dir; /当前目录的指针 if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-5); /*回到父目录*/ if(strcmp(sonfname,.)=0) if(current=2) printf(你现已经在根目录下!n);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1