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

📄 osdlg.cpp

📁 C++实现的模拟操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
bool COsDlg::Fdisk(CString strin,CString *strshow)     //分区
{
	if(!strin.Compare("fdisk"))    //没有参数,默认分区
	{
		char dn[8]={'a','b','c'};
		int big[8]={24,56};
		disk.Fdisk(3,dn,big);
		strshow->Format("初始化为 A B C 盘");	
		UpdataDiskTree();              //更新磁盘树形输出,和磁盘分配表输出
		UpdataShowInfo();
	}
	else
	{	/*int index=strin.Find(' ');				//返回空格键的索引
		int strlength=strin.GetLength();		//获得命令的总长度
		char dn[8]={'a','b','c'};
		int big[8]={24,56};
		disk.Fdisk(3,dn,big);
		osdlg.m_strresult.Format("初始化为 A B C 盘");*/
		strshow->Format("命令参数有误");
	}
	return TRUE;
}

bool COsDlg::Delete(CString strin,CString *strshow)		//删除文件
{
	int index=strin.Find(' ');           //返回空格键的索引
	char name[6]={' '};
	int strlength=strin.GetLength(); //获得命令的总长度
	if(12!=strlength)
	{
		strshow->Format("delete命令参数有误");
		return FALSE;
	}
	name[0]=strin.GetAt(index+1);
	name[1]=strin.GetAt(index+2);
	name[2]=strin.GetAt(index+3);
	name[3]=strin.GetAt(index+4);
	name[4]=strin.GetAt(index+5);

	if(disk.Delete(name,strshow))
	{
		UpdataDiskTree();              //更新磁盘树形输出,和磁盘分配表输出
		UpdataShowInfo();
	}

	pmemory->Createprocess("delete",dwtime);
	return TRUE;
}

bool COsDlg::Rdir(CString strin,CString *strshow)		//删除空目录
{
	int index=strin.Find(' ');           //返回空格键的索引
	char name[3]={' '};
	int strlength=strin.GetLength(); //获得命令的总长度
	if(8!=strlength)
	{
		strshow->Format("rdir 命令参数有误");
		return FALSE;
	}
	name[0]=strin.GetAt(index+1);
	name[1]=strin.GetAt(index+2);
	name[2]=strin.GetAt(index+3);

	if(disk.Rdir(name,strshow))
	{
		UpdataDiskTree();              //更新磁盘树形输出,和磁盘分配表输出
		UpdataShowInfo();
	}

	pmemory->Createprocess("rdir",dwtime);
	return TRUE;
}

bool COsDlg::Deldir(CString strin,CString *strshow)	//删除空或非空目录
{
	
	int index=strin.Find(' ');           //返回空格键的索引
	char name[3]={' '};
	int strlength=strin.GetLength(); //获得命令的总长度
	if(10!=strlength)
	{
		strshow->Format("deldir 命令参数有误");
		return FALSE;
	}
	name[0]=strin.GetAt(index+1);
	name[1]=strin.GetAt(index+2);
	name[2]=strin.GetAt(index+3);

	if(disk.Deldir(name,strshow))
	{
		UpdataDiskTree();              //更新磁盘树形输出,和磁盘分配表输出
		UpdataShowInfo();
	}

	pmemory->Createprocess("deldir",dwtime);
	return TRUE;
}

bool COsDlg::Type(CString strin,CString *strshow)		//显示文件
{
	int index=strin.Find(' ');           //返回空格键的索引
	char name[6]={' '};
	int strlength=strin.GetLength(); //获得命令的总长度
	if(10!=strlength)
	{
		strshow->Format("type 命令参数有误");
		return FALSE;
	}
	name[0]=strin.GetAt(index+1);
	name[1]=strin.GetAt(index+2);
	name[2]=strin.GetAt(index+3);
	name[3]=strin.GetAt(index+4);
	name[4]=strin.GetAt(index+5);

	CString str;
	disk.Type(name,str,strshow);

	pmemory->Createprocess("type",dwtime);
	return TRUE;
}

bool COsDlg::Edit(CString strin,CString *strshow)		//编辑文件
{
	int index=strin.Find(' ');           //返回空格键的索引
	char name[6]={' '};
	int strlength=strin.GetLength(); //获得命令的总长度
	if(10!=strlength)
	{
		strshow->Format("edit 命令参数有误");
		return FALSE;
	}
	name[0]=strin.GetAt(index+1);
	name[1]=strin.GetAt(index+2);
	name[2]=strin.GetAt(index+3);
	name[3]=strin.GetAt(index+4);
	name[4]=strin.GetAt(index+5);

	if(disk.Edit(name,strshow))
	{
		UpdataShowInfo();
		pmemory->Createprocess("edit",dwtime);
	}
	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////////////////
//执行命令函数
///////////////////////////////////////////////////////////////////////////////////////////
bool COsDlg::UpdataShowInfo()                        //更新显示磁盘分区表信息
{
	osdlg.m_strinfo="";
	CString s;

	for(int i=0;i<128;i++)
	{
		s.Format("%2x ",disk.byinfo[i]);
		osdlg.m_strinfo+=s;
		if(i%16==15)
			osdlg.m_strinfo+="\r\n";
		
	}		
	return TRUE;
}

void COsDlg::Carryout(){  //执行命令函数

	
	/*if(!osdlg.m_strinput.Compare("needa")){
		pmemory->Createprocess(osdlg.m_strinput,dwtime);
		osdlg.m_strinput="";
	}*/
	CString m_Strin=osdlg.m_strinput;		//复制命令。
	CString strError="";					//返回错误内容参数
	int index=m_Strin.Find(' ');			//返回空格键的索引
	int strlength=m_Strin.GetLength();		//获得命令的总长度

	if(!m_Strin.Compare("pub"))
	{
		PUB(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) == "cd")	//命令为CD是,因为参数可为1,2或3个如: cd a
	{
		if(!CD(m_Strin,&strError))
			osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) =="delete")
	{
		Delete(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) =="rdir")
	{
		Rdir(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) =="deldir")
	{
		Deldir(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) =="type")
	{
		Type(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) =="edit")
	{
		Edit(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(!m_Strin.Compare("fdisk"))
	{  
		Fdisk(m_Strin,&strError);
		osdlg.m_strresult=strError;
	}

	else if(m_Strin.Left(index) == "create")	//命令参数为五个如: Create abc.e
		{
			Create(m_Strin,&strError);
			osdlg.m_strresult=strError;
		}

	else if(m_Strin.Left(index) == "makdir")   //创建目录
	{
		Makdir(m_Strin,&strError);
		osdlg.m_strresult=strError;		
	}

	/*else if(!osdlg.m_strinput.Compare("chadir"))
	{
		pmemory->Createprocess(osdlg.m_strinput,dwtime);
	}*/

	else if(!osdlg.m_strinput.Compare("test"))
	{
		CString str;
		str="i++";

		pmemory->Createprocess("i++\r\ni--\r\ni++\r\ni--\r\ni++\r\ni--\r\ni++\r\ni--\r\ni++\r\ni--\r\ni++\r\ni--\r\ni++\r\ni--\r\ni++\r\ni--\r\n",dwtime);

	
	}
	else 	
	{	
		if(m_Strin.GetLength()==5)
		{
			CString str;
			char name[6];
			name[0]=m_Strin.GetAt(0);
			name[1]=m_Strin.GetAt(1);
			name[2]=m_Strin.GetAt(2);
			name[3]='.';
			name[4]=m_Strin.GetAt(4);
			if(disk.Find(name,&str,&strError))
			{
				if(!pmemory->Createprocess(str,dwtime))
					osdlg.m_strresult="编译错误";
			}
			else
			{
				osdlg.m_strresult.Format("%s 不是内部或外部命令",m_Strin.Left(index));
			}
		}
		else
		{
			osdlg.m_strresult.Format("%s 不是内部或外部命令",m_Strin.Left(index));
		}
	}
	osdlg.m_strinput="";
	osdlg.UpdateData(FALSE);
}

bool COsDlg::DiskTree(int index,HTREEITEM hRoot)     //替归更新磁盘树形显示,
{
	if(2>=index||128<index)
		return TRUE;                //出口
	if(disk.byinfo[index]<=2)
		return TRUE;				//出口

	char name[6]="";
	byte type;
	List list;
	HTREEITEM hnewRoot;
	byte newindex;

	disk.file.Seek(index*64,CFile::begin);
	disk.file.Read(&list,sizeof(List));
	type=list.type;
	switch(type)
		{
		case 3:
			name[3]='.';
			name[4]=list.postfix;
		case 2:
			name[2]=list.name[2];
			name[1]=list.name[1];
		case 1:
			name[0]=list.name[0];
		}
	hnewRoot=osdlg.InsertTree(hRoot,name,type,1);
	
	newindex=disk.byinfo[index];   //遍历同层目录
	DiskTree(newindex,hRoot);
	
	if(2==list.type)   //如果是目录,则遍历子目录
	{
		newindex=list.start;
		DiskTree(newindex,hnewRoot);
	}
	return TRUE;
}

bool COsDlg::UpdataDiskTree()        //更新磁盘树形显示
{
	HTREEITEM hRoot,hnewRoot;
	char name[6]="";
	byte type;
	int index=0;
	int sonindex=0;

	osdlg.m_showdisk.DeleteAllItems();

	for(int i=0;i<disk.byRootnum;i++)
	{
		hRoot=TVI_ROOT;
		type=disk.Rootlist[i].type;
		switch(type)
		{
		case 3:
			name[3]='.';
			name[4]=disk.Rootlist[i].postfix;
		case 2:
			name[2]=disk.Rootlist[i].name[2];
			name[1]=disk.Rootlist[i].name[1];
		case 1:
			name[0]=disk.Rootlist[i].name[0];
		}
		hnewRoot=osdlg.InsertTree(hRoot,name,type,1);
		index=disk.Rootlist[i].start;
		DiskTree(index,hnewRoot); //遍历子目录

	}
	return TRUE;
}

void COsDlg::OnChangeEdit1() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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