简单文件系统的实现_Operating system中简单文件系统的实现

目的:在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。在退出这个简单的文件系统时,应将该虚拟文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。

实现效果:

11b5ea836420d8537b76d4a4a140f759.png

5fc82dcc4fc83d84ded91f58e890873b.png

代码:

#include

#include

#include

#include

using namespace std;

#include  

#include

#include

#define GENERAL 1

#define DIRECTORY 2

#define Zero 0

struct FCB

{

char fname[16]; // 文件名

char type; // 0 空文件

int size; // 文件大小

int fatherBlockNum;

int currentBlockNum;

//1 目录文件 2 空文件

//当前的父目录盘块号

//当前的盘块

void initialize()

{

strcpy(fname,"\0");

type = 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; //磁盘大小

const int BlockFcbCount = BlockSize/sizeof(FCB);// 目录文件的最多FCB 数

int OpenFileCount = 0; //统计当前打开文件数目

struct OPENLIST

{

//用户文件打开表

int files; //当前打开文件数

FCB f[OPEN_MAX]; //FCB拷贝

OPENLIST()

{

files=0;

for(int i=0;i

{

f[i].fatherBlockNum = -1;// 为分配打开

f[i].type=GENERAL;

}

}

};

struct dirFile/*-------------目录文件结构---------------*/

{

struct FCB fcb[BlockFcbCount];

void init(int _FatherBlockNum,int _CurrentBlockNum,char *name)//父块号,当前块号,目录名

{

strcpy(fcb[0].fname,name); // 本身的  FCB

fcb[0].fatherBlockNum=_FatherBlockNum;

fcb[0].currentBlockNum=_CurrentBlockNum;

fcb[0].type=DIRECTORY; // 标记目录文件

for(int i=1;i

{

fcb[i].fatherBlockNum=_CurrentBlockNum; //

fcb[i].type=Zero; //  标记为空白项标记为子项

}

}

};

struct DISK/**********************************************************************/

{

int FAT1[BlockCount]; //FAT1

int FAT2[BlockCount]; //FAT2

struct dirFile root; //根目录

char data[BlockCount-3][BlockSize];

void format()

{

memset(FAT1,0,BlockCount); //FAT1

memset(FAT2,0,BlockCount); //FAT2

FAT1[0]=FAT1[1]=FAT1[2]=-2; //0,1,2 盘块号依次代表

FAT2[0]=FAT2[1]=FAT2[2]=-2; //FAT 作备份FAT1,FAT2,根目录区

root.init(2,2,"C:\\");//根目录区

memset(data,0,sizeof(data));// 数据区

}

};

FILE *fp; // 磁盘文件地址

char * BaseAddr; //虚拟磁盘空间基地址

string currentPath="C:\\"; //当前路径

int current=2; //当前目录的盘块号

string cmd; //输入指令

struct DISK *osPoint; //磁盘操作系统指针

char command[16]; // 文件名标识

struct OPENLIST* openlist; // 用户文件列表指针

int format();

int mkdir(char *sonfname);

int rmdir(char *sonfname);

int create(char *name);

int listshow();

int delfile(char *name);

int changePath(char *sonfname);

int write(char *name);

int exit();

int open(char *file);

int close(char *file);

int read(char *file);

/*------------  初始化 -----------------------*/

int format()

{

current = 2;

currentPath="C:\\"; // 当前路径

osPoint->format();// 打开文件列表初始化

delete openlist;

openlist=new OPENLIST;

/*------- 保存到磁盘上 myfiles--------*/

fp = fopen(FilePath,"w+");

fwrite(BaseAddr,sizeof(char),DiskSize,fp);

fclose(fp);

printf(" 格式化成功!!\n");

return 1;

}

/*----------------------- 创建子目录  -------------------*/

int mkdir(char *sonfname)// 判断是否有重名寻找空白子目录项寻找空白盘块号当前目录下增加该子目录项分配子目录盘块,并且初始化修改 fat 表

{

int i,temp

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共两个不同设计例子,都含详细的文档资料。 任务2.设计一个简单的二级文件系统 设计要求: 在任一OS下,建立一个文件,把它假象成硬盘,在其实现一个简单的模拟文件系统。 编写一管理程序对此空间进行管理,要求: 1. 实现盘块管理 2. 实现文件的读写操作 3. 每组最多2人,小组内要有明确分工,课程设计报告设计部分可以相同,个人实现部分不同 参考建议: 将模拟硬盘的文件空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。 设计技术参数(数据结构)参考: #define MaxSize 100 #define Disk 512 //每个盘块大小为512bit #define NumDisk 2048 //有2048个盘块,既可分配空间为 1M /*************目录和文件的结构定义***********************/ struct DirectoryNode { char name[9]; /*目录或文件的名字*/ int type; /*0代表目录,1代表普通文件*/ struct DirectoryNode *next; /*指向下一个兄弟结点的指针*/ struct DirectoryNode *preDirFile; /*指向父结点的指针*/ struct DirectoryNode *subFile; /*指向第一个子结点的指针*/ int size; /*如果是文件则表示文件的大小*/ int first; /*起始盘块号*/ int last; /*末尾盘块号*/ int order; /*备用*/ }; //连续分配 struct FileSys { int VacTable[NumDisk]; //空闲表,0为空闲,1为被用 struct DirectoryNode root; //根目录 struct DirectoryNode Directory[NumDisk]; } *filesys; typedef struct { struct DirectoryNode *DirFile; char name[9]; }DataType; //包含一个指向目录的指针和名字 typedef struct { //队列结构的实现 DataType data[MaxSize]; int front,rear; //分别表示队列的头结点和尾结点 }Tp; void InitQueue(Tp *sq) //队列初始化 int EnAddQueue(Tp *sq,DataType data) //在队列增加元素 DataType EnDelQueue(Tp *sq) //从队列删除一个元素 int Empty(Tp *sq) //判断队列是否为空,返回0表示队列为空 ①.Dir:显示目录内容命令,显示当前目录下的文件和子目录。 ②.Md:创建目录操作。 ③.Create:创建文件,在当前目录下创建一个文件。 ④. all:显示从根目录开始的所有目录和文件及其层次结点。 ⑤.Cd:改变目录。 ⑥.Del:删除文件操作。 ⑦. Rd:删除目录操作,删除当前目录下的子目录。 ⑧. Ren:重命名函数 ⑨. Exit:退出命令

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值