2022年2022年简单文件系统实现 2.pdf
《2022年2022年简单文件系统实现 2.pdf》由会员分享,可在线阅读,更多相关《2022年2022年简单文件系统实现 2.pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、#include#include#include#include using namespace std;#define GENERAL 1/1 代表普通文件2 代表目录文件0 表示空文件#define DIRECTORY 2#define Zero 0 struct FCB char fname16;/文件名char type;/0 空文件1 目录文件2 空文件int size;/文件大小int fatherBlockNum;/当前的父目录盘块号int currentBlockNum;/当前的盘块void initialize()strcpy(fname,0);type=Zero;size=
2、0;fatherBlockNum=currentBlockNum=0;const char*FilePath=C:myfiles;/*常量设置*/const int BlockSize=512;/盘块大小const int OPEN_MAX=5;/能打开最多的文件数const int BlockCount=128;/盘块数const int DiskSize=BlockSize*BlockCount;/磁盘大小 64K const int FcbCount=BlockSize/sizeof(FCB);/目录文件的最多FCB数int OpenFileCount=0;/统计当前打开文件数目stru
3、ct OPENLIST/用户文件打开表 int files;/当前打开文件数FCB fOPEN_MAX;/FCB 拷贝OPENLIST()files=0;for(int i=0;iOPEN_MAX;i+)名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 15 页 -fi.fatherBlockNum=-1;/为分配打开fi.type=GENERAL;struct dirFile/*-目录文件结构-*/struct FCB fcbFcbCount;void init(int _FatherBlockNum,int _CurrentBlockNum,char*name)/父块号,当前块
4、号,目录名 strcpy(fcb0.fname,name);/本身的 FCB fcb0.fatherBlockNum=_FatherBlockNum;fcb0.currentBlockNum=_CurrentBlockNum;fcb0.type=DIRECTORY;/标记目录文件for(int i=1;iformat();/打开文件列表初始化delete openlist;openlist=new OPENLIST;/*-保存到磁盘上myfiles-*/fp=fopen(FilePath,w+);fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(
5、fp);printf(格式化成功!n);return 1;int mkdir(char*sonfname)/*-创建子目录-*/判断是否有重名、寻找空白子目录项、寻找空白盘块号、当前目录下增加该子目录项、分配子目录盘块并且初始化、修改fat 表int i,temp,iFAT;struct dirFile*dir;/当前目录的指针if(current=2)/根目录dir=&(osPoint-root);else dir=(struct dirFile*)(osPoint-datacurrent-3);/*-为了避免该目录下同名文件夹-*/名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,
6、共 15 页 -for(i=1;ifcbi.type=DIRECTORY&strcmp(dir-fcbi.fname,sonfname)=0)printf(该文件夹下已经有同名的文件夹存在了!n);return 0;for(i=1;i fcbi.type=Zero)break;if(i=FcbCount)printf(该目录已满!请选择新的目录下创建!n);return 0;temp=i;for(i=3;i FAT1i=0)break;if(i=BlockCount)printf(磁盘已满!n);return 0;iFAT=i;/*-接下来进行分配-*/osPoint-FAT1iFAT=osP
7、oint-FAT2iFAT=2;/2 表示分配给下级目录文件/填写该分派新的盘块的参数strcpy(dir-fcbtemp.fname,sonfname);dir-fcbtemp.type=DIRECTORY;dir-fcbtemp.fatherBlockNum=current;dir-fcbtemp.currentBlockNum=iFAT;/初始化子目录文件盘块dir=(struct dirFile*)(osPoint-data iFAT-3);/定位到子目录盘块号dir-init(current,iFAT,sonfname);/iFAT 是要分配的块号,这里的current 用来指要分配
8、的块的父块号printf(创建子目录成功!n);return 1;int rmdir(char*sonfname)/*-删除当前目录下的文件夹-*/名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 15 页 -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=DIRECTORY&strcmp(dir-fc
9、bi.fname,sonfname)=0)break;temp=i;if(i=FcbCount)printf(当前目录下不存在该子目录!n);return 0;j=dir-fcbtemp.currentBlockNum;struct dirFile*sonDir;/当前子目录的指针sonDir=(struct dirFile*)(osPoint-data j-3);for(i=1;ifcbi.type!=Zero)printf(该文件夹为非空文件夹,为确保安全,请清空后再删除!n);return 0;/*开始删除子目录操作*/osPoint-FAT1j=osPoint-FAT2j=0;/fat
10、 清空char*p=osPoint-dataj-3;/格式化子目录memset(p,0,BlockSize);dir-fcbtemp.initialize();/回收子目录占据目录项printf(删除当前目录下的文件夹成功n);return 1;/*-在当前目录下创建文本文件-*/int create(char*name)int i,iFAT;/temp,int emptyNum=0,isFound=0;/空闲目录项个数struct dirFile*dir;/当前目录的指针名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 15 页 -if(current=2)dir=&(osPoi
11、nt-root);else dir=(struct dirFile*)(osPoint-data current-3);for(i=1;ifcbi.type=Zero&isFound=0)emptyNum=i;isFound=1;else if(dir-fcbi.type=GENERAL&strcmp(dir-fcbi.fname,name)=0)printf(无法在同一目录下创建同名文件!n);return 0;if(emptyNum=0)printf(已经达到目录项容纳上限,无法创建新目录!n);return 0;for(i=3;iFAT1i=0)break;if(i=BlockCount
12、)printf(磁盘已满!n);return 0;iFAT=i;/*-进入分配阶段-*/分配磁盘块osPoint-FAT1iFAT=osPoint-FAT2iFAT=1;/*-接下来进行分配-*/填写该分派新的盘块的参数strcpy(dir-fcbemptyNum.fname,name);dir-fcbemptyNum.type=GENERAL;dir-fcbemptyNum.fatherBlockNum=current;dir-fcbemptyNum.currentBlockNum=iFAT;dir-fcbemptyNum.size=0;char*p=osPoint-dataiFAT-3;m
13、emset(p,0,BlockSize);printf(在当前目录下创建文本文件成功!n);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 15 页 -return 1;/*-查询子目录-*/int listshow()int i,DirCount=0,FileCount=0;/搜索当前目录struct dirFile*dir;/当前目录的指针if(current=2)dir=&(osPoint-root);else dir=(struct dirFile*)(osPoint-data current-3);for(i=1;ifcbi.type=GENERAL)/查找普通文件Fi
14、leCount+;printf(%s 文本文件.n,dir-fcbi.fname);if(dir-fcbi.type=DIRECTORY)/查找目录文件DirCount+;printf(%s 文件夹.n,dir-fcbi.fname);printf(n该目录下共有%d 个文本文件,%d 个文件夹 nn,FileCount,DirCount);return 1;/*-在当前目录下删除文件-*/int delfile(char*name)int i,temp,j;/确保当前目录下有该文件,并且记录下它的FCB下标struct dirFile*dir;/当前目录的指针if(current=2)dir
15、=&(osPoint-root);else dir=(struct dirFile*)(osPoint-data current-3);for(i=1;i fcbi.type=GENERAL&strcmp(dir-fcbi.fname,name)=0)break;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 15 页 -if(i=FcbCount)printf(当前目录下不存在该文件!n);return 0;int k;for(k=0;kf k.type=GENERAL)&(strcmp(openlist-f k.fname,name)=0)if(openlist-fk.fat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年简单文件系统实现 2022 简单 文件系统 实现
限制150内