⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disk.cpp

📁 C++实现的模拟操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Disk.cpp: implementation of the CDisk class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "os.h"
#include "Disk.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDisk::CDisk()
{
	if(0==file.Open("file.txt",CFile::modeReadWrite ,NULL))
	{
		file.Open("file.txt",CFile::modeCreate,NULL);		
		file.Close();
		file.Open("file.txt",CFile::modeReadWrite ,NULL);
		file.SetLength(64*128);
	}
	else
	{
		file.SeekToBegin();
		file.Read(&byinfo,sizeof(byte)*128);
		file.Read(Rootlist,sizeof(List)*8);
		byRootnum=byinfo[2];
	}
	load.RemoveAll();
}

CDisk::~CDisk()
{
	file.Close();

}

int CDisk::LtoP(byte L_address) //逻辑地址转换成物理地址
{
	return L_address*64;
}

bool CDisk::Fdisk(int num,char name[8],int big[8])   //初始化模拟硬盘
{
	int i,all;
	all=0;
	for(i=0;i<num-1;i++){
		all+=big[i];
	}
	big[num-1]=125-all;					 //计算最后一个盘的大小
	if(num>8||big[num-1]<1)
		return FALSE;
	file.SetLength(0);					//清除文件内容
	file.SetLength(128*64);				//设置文件的长度

	byinfo[0]=byinfo[1]=1;				//硬盘起始三个区用为系统管理
	byinfo[2]=num;						//存根目录数 
	byRootnum=num;						//存根目录数
	for(i=3;i<128;i++){					//初始化磁盘分配表
		byinfo[i]=0;
	}
	file.SeekToBegin();
	file.Write(byinfo,sizeof(byte)*128);  //初始分区表
	int add=3;
	for(i=0;i<num;i++){
		Rootlist[i].name[0]=name[i];  //磁盘名
		Rootlist[i].start=add;        //起始地址
		Rootlist[i].type=1;           //类型为根目录
		Rootlist[i].ilength=big[i];   //磁盘大小
		add=add+big[i];        
	
	}
	file.Write(&Rootlist,sizeof(List)*byRootnum);
	load.RemoveAll();
	return TRUE;
}

bool CDisk::Seekroom(char name,int L_address[3],int big)
	                //寻找空间,在指定的盘 name 找指定的空间 big,L_address[3]为返回空闲地址
{
	if(big>3)
		return FALSE;
	int i,index=0;

	for(i=0;i<byRootnum;i++)
	{
		if(Rootlist[i].name[0]==name)  //在指定盘号的位置寻找空间
		{
			int nCount=Rootlist[i].start+Rootlist[i].ilength;
			for(int j=Rootlist[i].start;j<nCount;j++)
			{
				if(0==byinfo[j])
				{
					L_address[index]=j;
					index++;
					if(index==big)
					{
						return TRUE;
					}
				}
			}
		}
	
	}
	return FALSE;
}

bool CDisk::Find(char name[6],CString *str,CString * strError)//查找文件
{
	int nCount=load.GetSize(); //得到路径的长度	
	if(0==nCount)              //在根目录下
	{
		strError->Format("找不到该文件");
		return FALSE;
	}
	
	BYTE index;
	if(1==nCount)
	{
		list=Rootlist[load[0]];
		index=list.start;
	}
	else
	{
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));
		index=list.start;                       //得到该目录的开始位置		
	}
	if(2<index)
	{
		for(;byinfo[index]>2;)
		{
			file.Seek(LtoP(index),CFile::begin);
			file.Read(&list,sizeof(List));
			if(3==list.type)
			{
				if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2]&&list.postfix=='e')
				{
					char ch[65]={0};
					*str="";
					byte in;
					in=list.start;
					for(;2<in&&in<=128;)
					{
						file.Seek(LtoP(in),CFile::begin);
						file.Read(ch,64);
						*str+=ch;
						in=byinfo[in];
					}
					return TRUE;
				}
			}
			
			index=byinfo[index];
			if(index>128||index<=2)
				break;
		}
	}    //
	strError->Format("不能找到该文件");
	return FALSE;
}

bool CDisk::Create(char name[3],CString * strError,char potfix) //创建文件.strError为传送错误信息
{
	int nCount=load.GetSize(); //得到路径的长度

	if(0==nCount)              //在根目录下
	{
		strError->Format("在根目录中不可建立文件");
		return FALSE;
	}
	
	BYTE index;
	if(1==nCount)   //判断是否重名
	{
		list=Rootlist[load[0]];
		index=list.start;
	}
	else
	{
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));
		index=list.start;                       //得到该目录的开始位置		
	}
	if(2<index)
	{
		for(;byinfo[index]>2;)
		{
			file.Seek(LtoP(index),CFile::begin);
			file.Read(&list,sizeof(List));
			if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2])
			{
				strError->Format("创建文件失败\r\n相同的文件名");
				return FALSE;
			}

			index=byinfo[index];
			if(index>128||index<=2)
				break;
		}
	}    //

	int L_address[3];
	 index= load[0];
	if(!Seekroom(Rootlist[index].name[0],L_address))
	{
		strError->Format("没有足够的空间");
		return FALSE;
	}


	if(1==nCount)  //如果在第一层目录下
	{
		list=Rootlist[load[0]];
		index=list.start;
		
	}
	else
	{
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));
		index=list.start;                       //得到该目录的开始位置
		if(0==index) //如果在空目录中创建文件
		{
			index=list.start=L_address[0];
			byinfo[L_address[0]]=255;
			file.Seek(LtoP(load[nCount-1]),CFile::begin);
			file.Write(&list,sizeof(List));
		}
	}
	
	for(;byinfo[index]!=0;)
	{
		if(byinfo[index]>128)
		{
			byinfo[index]=L_address[0];   //在该文件目录的最后添加此文件
			break;
		}
		index=byinfo[index];
	}
	if(0==byinfo[index]) //如果第一次创建文件
	{
		byinfo[index]=255;
	}
	
	byinfo[L_address[0]]=255; //指向他下个连接地址
	byinfo[L_address[1]]=255;                   //修改分配表

	list.ilength=0;
	list.name[0]=name[0];
	list.name[1]=name[1];
	list.name[2]=name[2];
	list.postfix=potfix;
	list.start=L_address[1];
	list.type=3;

	file.Seek(LtoP((byte)L_address[0]),CFile::begin);
	file.Write(&list,sizeof(List));
	file.SeekToBegin();
	file.Write(byinfo,sizeof(byte)*128);
	char ch[64]="";
	file.Seek(LtoP((byte)L_address[1]),CFile::begin);
	file.Write(ch,64);
	return TRUE;
}

bool CDisk::Makdir(char name[3],CString * strError) //创建文件夹.strError为传送错误信息
{
	int nCount=load.GetSize(); //得到路径的长度
	if(0==nCount)              //在根目录下
	{
		strError->Format("在根目录中不可建立文件");
		return FALSE;
	}
	BYTE index;
	if(1==nCount)   //判断是否重名
	{
		list=Rootlist[load[0]];
		index=list.start;
	}
	else
	{
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));
		index=list.start;                       //得到该目录的开始位置		
	}
	if(2<index)
	{
		for(;byinfo[index]>2;)
		{
			file.Seek(LtoP(index),CFile::begin);
			file.Read(&list,sizeof(List));
			if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2])
			{
				strError->Format("创建目录失败\r\n相同的文件名");
				return FALSE;
			}

			index=byinfo[index];
			if(index>128||index<=2)
				break;
		}
	}    //

	int L_address[3];
	index= load[0];
	if(!Seekroom(Rootlist[index].name[0],L_address,1))
	{
		strError->Format("没有足够的空间");
		return FALSE;
	}

	if(1==nCount)  //如果在第一层目录下
	{
		
		list=Rootlist[load[0]];
		index=list.start;
	
	}
	else
	{
		
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));
		index=list.start;                       //得到该目录的开始位置
	}
	if(0==index) //如果在空目录中创建文件 肯定不在根目录
	{
		index=list.start=L_address[0];
		byinfo[L_address[0]]=255;
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Write(&list,sizeof(List));
	}
	for(;byinfo[index]!=0;)
	{
		if(byinfo[index]>128)
		{
			byinfo[index]=L_address[0];   //在该文件目录的最后添加此文件
			break;
		}
		index=byinfo[index];
	}
	if(0==byinfo[index]) //如果第一次创建文件
	{
		byinfo[index]=255;
	}
	
	byinfo[L_address[0]]=255;   //修改分配表为已用

	list.ilength=0;
	list.name[0]=name[0];
	list.name[1]=name[1];
	list.name[2]=name[2];
	list.start=0;
	list.type=2;

	file.Seek(LtoP((byte)L_address[0]),CFile::begin);
	file.Write(&list,sizeof(List));
	file.SeekToBegin();
	file.Write(byinfo,sizeof(byte)*128);
	return TRUE;
}

bool CDisk::CD(char name[3],CString * strError)        //进入下一层目录
{
	int nCount=load.GetSize();
	if('.'==name[0]&&'.'==name[1]&&' '==name[2])
	{
		if(0==nCount)
		{
			strError->Format("根目录");
			return FALSE;
		}
		load.RemoveAt(nCount-1);                       //删除最后一个
		return TRUE;
	}

	if(0==nCount)
	{
		for(int i=0;i<byRootnum;i++)
		{
			if(name[0]==Rootlist[i].name[0]&&name[1]==' '&&name[2]==' ')
			{
				load.Add(i);     //如果是进入根目录,则存根目录的索引
				return TRUE;
			}
		}
		strError->Format("不能找到%c%c%c",name[0],name[1],name[2]);
		return FALSE;
	}

	byte index=load[nCount-1];
	if(1==nCount)	//如果在*盘中,进入下一层
	{
		index=Rootlist[index].start;
	}
	else
	{
		file.Seek(LtoP(index),CFile::begin);
		file.Read(&list,sizeof(List));
		index=list.start;
	}
	while(byinfo[index]>2)
	{
		file.Seek(LtoP(index),CFile::begin);
		file.Read(&list,sizeof(List));
		if(1==list.type||2==list.type)   //如果是目录
		{
			if(list.name[0]==name[0]&&list.name[1]==name[1]&&list.name[2]==name[2])
			{
				load.Add(index);
				return TRUE;
			}
		}
		if(128<index)  //如果没有下一个目录,跳出
			break;
		index=byinfo[index];
	}
	strError->Format("不能找到%c%c%c",name[0],name[1],name[2]);

	return FALSE;
}

bool CDisk::Delete(char name[6],CString * strError)   //删除文件
{
	int nCount=load.GetSize();            //得到当前路径层数
	byte nextin,in;                   //下一个地址;
	if(0==nCount)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -