ImageVerifierCode 换一换
格式:DOCX , 页数:39 ,大小:22.25KB ,
资源ID:10020305      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10020305.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统 文件存储空间管理位示图法.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统 文件存储空间管理位示图法.docx

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