简单文件系统实现

上传人:豆浆 文档编号:20504148 上传时间:2017-11-22 格式:DOCX 页数:15 大小:22.69KB
返回 下载 相关 举报
简单文件系统实现_第1页
第1页 / 共15页
简单文件系统实现_第2页
第2页 / 共15页
简单文件系统实现_第3页
第3页 / 共15页
简单文件系统实现_第4页
第4页 / 共15页
简单文件系统实现_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《简单文件系统实现》由会员分享,可在线阅读,更多相关《简单文件系统实现(15页珍藏版)》请在金锄头文库上搜索。

1、#include #include #include #include using namespace std;#define GENERAL 1/1 代表普通文件 2 代表目录文件 0 表示空文件#define DIRECTORY 2#define Zero 0struct FCBchar fname16; /文件名char type; / 0 空文件 1 目录文件 2 空文件 int size; /文件大小int fatherBlockNum; /当前的父目录盘块号int currentBlockNum; /当前的盘块void initialize()strcpy(fname,0);typ

2、e = Zero;size =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; /磁盘大小 64Kconst int FcbCount = BlockSize/sizeof(FCB);/目录文件的最多

3、FCB 数int OpenFileCount = 0; / 统计当前打开文件数目 struct OPENLIST /用户文件打开表int files; /当前打开文件数FCB fOPEN_MAX; /FCB 拷贝OPENLIST()files=0;for(int i=0;iformat();/打开文件列表初始化delete openlist;openlist=new OPENLIST;/*-保存到磁盘上 myfiles-*/fp = fopen(FilePath,w+);fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);printf(格式

4、化成功!n);return 1;int mkdir(char *sonfname)/*-创建子目录-*/判断是否有重名、寻找空白子目录项、寻找空白盘块号、当前目录下增加该子目录项、分配子目录盘块并且初始化、修改 fat 表int i,temp,iFAT;struct dirFile *dir; /当前目录的指针if(current = 2) / 根目录 dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-datacurrent-3);/*-为了避免该目录下同名文件夹-*/for(i = 1;ifcbi.type=DIRECTORY &

5、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=osPoint-FAT2iFAT = 2; /2 表

6、示分配给下级目录文件/填写该分派新的盘块的参数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 用来指要分配的块的父块号printf(创建子目

7、录成功!n);return 1;int rmdir(char *sonfname)/*-删除当前目录下的文件夹-*/int i,temp,j;/确保当前目录下有该文件,并记录下该 FCB 下标struct dirFile *dir; /当前目录的指针if(current=2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3);for(i=1;ifcbi.type=DIRECTORY & strcmp(dir-fcbi.fname,sonfname)=0)break;temp=i;if(i=FcbCount

8、)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 清空char *p=osPoint-dataj-3; /格式化子目录me

9、mset(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; /当前目录的指针if(current=2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3);fo

10、r(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)printf(磁盘已满!n);return 0;iFAT=i;/*-进入分配阶段-*

11、/分配磁盘块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;memset(p,0,BlockSize);printf(在当前目录

12、下创建文本文件成功!n);return 1;/*-查询子目录-*/int listshow()int i,DirCount=0,FileCount=0;/搜索当前目录struct dirFile *dir; /当前目录的指针if(current=2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3);for(i=1;ifcbi.type=GENERAL) /查找普通文件FileCount+;printf(%s 文本文件.n,dir-fcbi.fname);if(dir-fcbi.type=DIRECTOR

13、Y) /查找目录文件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=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data

14、 current-3);for(i=1;i fcbi.type=GENERAL & strcmp(dir-fcbi.fname,name)=0)break;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.fatherBlockNum = current)break;elseprintf(该文件未在当前目录下!n);return 0;if(k!=OPEN_MAX)close(name);/从打开列表中删除 /*开始删除文件操作*/temp=i;j = dir-fcb temp.currentBlockNum ; /查找盘块号 josPoint-FAT1j=osPoint-FAT2j=0; /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号