#include <stdio.h>
#include <memory.h>
#include <string>
#include <iostream>
#include <windows.h> //Sleep()
#include <time.h> //时间相关
using namespace std;
//1代表普通文件2代表目录文件0表示空文件
#define GENERAL 1
#define DIRECTORY 2
#define NULL 0
int i;
struct FCB
{
char fname[16]; //文件名
char type;
int size; //文件大小
int fatherBlockNum; //当前的父目录盘块号
int currentBlockNum; //当前的盘块
void initialize()
{
strcpy(fname,"\0");
type = NULL;
size =0;
fatherBlockNum = currentBlockNum = 0;
}
};
/*常量设置*/
const char* FilePath = "D:\\OSfiles";
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<OPEN_MAX;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<BlockFcbCount;i++){
fcb[i].fatherBlockNum=_CurrentBlockNum; //标记为子项
fcb[i].type=NULL; // 标记为空白项
}
}
};
/**********************************************************************/
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盘块号依次代表FAT1,FAT2,根目录区
FAT2[0]=FAT2[1]=FAT2[2]=-2; //FAT作备份
root.init(2,2,"D:\\");//根目录区
memset(data,0,sizeof(data));//数据区
}
};
/*-----------------全局变量--------------------------*/
FILE *fp; //磁盘文件地址
char * BaseAddr; //虚拟磁盘空间基地址
string currentPath="D:\\"; //当前路径
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 help(); //帮助说明
/*------------初始化-----------------------*/
int format()
{
current = 2;
currentPath="D:\\"; //当前路径
osPoint->format();//打开文件列表初始化
delete openlist;
openlist=new OPENLIST;
/*-------保存到磁盘上OSfiles--------*/
fp = fopen(FilePath,"w+");
fwrite(BaseAddr,sizeof(char),DiskSize,fp);
fclose(fp);
printf("-----*********************************------\n\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->data [current-3]);
/*--------为了避免该目录下同名文件夹--------*/
for(i = 1;i<BlockFcbCount;i++)
{
if(dir->fcb[i].type==DIRECTORY && strcmp(dir->fcb[i].fname,sonfname)==0 )
{
printf("该文件夹下已经有同名的文件夹存在了!\n");
return 0;
}
}
//查找空白fcb序号
for(i=1;i<BlockFcbCount;i++)
{
if(dir->fcb[i].type==NULL)
break;
}
if(i==BlockFcbCount)
{
printf("该目录已满!请选择新的目录下创建!\n");
return 0;
}
temp=i;
for(i = 3;i < BlockCount;i++)
{
if(osPoint->FAT1[i] == 0)
break;
}
if(i == BlockCount)
{
printf("磁盘已满!\n");
return 0;
}
iFAT=i;
/*-------------接下来进行分配----------*/
osPoint->FAT1[iFAT]=osPoint->FAT2[iFAT] = 2; //2表示分配给下级目录文件
//填写该分派新的盘块的参数
strcpy(dir->fcb[temp].fname,sonfname);
dir->fcb[temp].type=DIRECTORY;
dir->fcb[temp].fatherBlockNum=current;
dir->fcb[temp].currentBlockNum=iFAT;
//初始化子目录文件盘块
dir=(struct dirFile*)(osPoint->data [iFAT-3]); //定位到子目录盘块号
dir->init (current,iFAT,sonfname);//iFAT是要分配的块号,这里的current用来指要分配的块的父块号
printf("-----*******************************************------\n\n");
return 1;
}
/*-------删除当前目录下的文件夹--------*/
int rmdir(char *sonfname)
{
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;i<BlockFcbCount;i++)
{ //查找该目录文件
if(dir->fcb[i].type==DIRECTORY && strcmp(dir->fcb[i].fname,sonfname)==0)
{
break;
}
}
temp=i;
if(i==BlockFcbCount)
{
printf("当前目录下不存在该子目录!\n");
return 0;
}
j = dir->fcb[temp].currentBlockNum;
struct dirFile *sonDir; //当前子目录的指针
sonDir=(struct dirFile *)(osPoint->data [ j - 3]);
for(i=1;i<BlockFcbCount;i++) //查找子目录是否为空目录
{
if(sonDir->fcb[i].type!=NULL)
{
printf("该文件夹为非空文件夹,为确保安全,请清空后再删除!\n");
return 0;
}
}
/*开始删除子目录操作*/
osPoint->FAT1[j] = osPoint->FAT2[j]=0; //fat清空
char *p=osPoint->data[j-3]; //格式化子目录
memset(p,0,BlockSize);
dir->fcb[temp].initialize(); //回收子目录占据目录项
printf("----**********-------************--------**********-----\n\n");
return 1;
}
/*-----------在当前目录下创建文本文件---------------*/
int create(char *name)
{
int i,iFAT;//temp,
int emptyNum = 0,isFound = 0; //空闲目录项个数
struct dirFile *dir; //当前目录的指针
if(current==2)
没有合适的资源?快使用搜索试试~ 我知道了~
操作系统课程设计模拟操作系统文件系统
共14个文件
pdb:2个
dsp:1个
cpp:1个
需积分: 28 38 下载量 63 浏览量
2011-07-01
12:16:01
上传
评论 2
收藏 1.9MB RAR 举报
温馨提示
操作系统课程设计模拟操作系统文件系统在任一OS下,建立一个大文件,将其假象成硬盘,在其中实现一个简单的模拟文件系统。 编写管理程序对此空间进行管理
资源推荐
资源详情
资源评论
收起资源包目录
操作系统课程设计200841409113suham.rar (14个子文件)
操作系统课程设计200841409113suham
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.cpp 24KB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.opt 48KB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.plg 348B
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.dsp 4KB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.dsw 622B
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.ncb 33KB
200841409113操作系统课程设计报告suham Ting.doc 236KB
Debug
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.exe 556KB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.pch 5.15MB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.ilk 800KB
vc60.idb 177KB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.obj 180KB
200841409113操作系统课程设计模拟操作系统文件系统suhamTing.pdb 1.09MB
vc60.pdb 132KB
共 14 条
- 1
资源评论
DSHEmperor
- 粉丝: 486
- 资源: 38
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功