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

📄 disk.cpp

📁 C++实现的模拟操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		strError->Format("根目录中不能删除文件");
		return FALSE;
	}

	if(1==nCount)
	{
		list=Rootlist[load[0]];           //得到目录信息
	}
	else
	{
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));     //得到目录信息
	}
	
	if(2>=byinfo[list.start])           //如果目录为空
	{
		strError->Format("目录为空");
		return FALSE;
	}
	
	byte BIndex=list.start;        //保存当前起始地址,即他下一层的父地址
	List Nextlist;                       //保存他下一个目录;
	
	file.Seek(LtoP(list.start),CFile::begin);
	file.Read(&Nextlist,sizeof(List));       //读取第一个子目录信息;
	
	
	if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2]&&Nextlist.postfix==name[4])
		//如果是删除此目录,即第一个目录
	{
		if(3==Nextlist.type)           //如果是文件类型		         
		{	
			nextin=Nextlist.start;
			for(;nextin>2&&nextin<=128;)  //将分配给他的内容地址标为未用
			{	
				in=byinfo[nextin];
				byinfo[nextin]=0;
				nextin=in;
			}
			if(2<byinfo[BIndex]&&byinfo[BIndex]<=128)  //如果有兄弟目录
			{
				BIndex=byinfo[BIndex];          //BIndex存储其兄弟目录的地址
				file.Seek(LtoP(BIndex),CFile::begin);
				file.Read(&Nextlist,sizeof(List));
				file.Seek(LtoP(list.start),CFile::begin);
				file.Write(&Nextlist,sizeof(List));         //将其兄弟目录移动到目录起始地址
				
				byinfo[list.start]=byinfo[BIndex];  //修改分配表,将其兄弟指向的下一				                                        
				byinfo[BIndex]=0;					//个地址附给起目录指向的下一个地址.
				
			}
			else		//没有兄弟目录
			{
				byinfo[list.start]=0;  //清空目录
				if(2==list.type)      //如果是子目录,不是盘号
				{
					list.start=0;     //将目录起始地址清空,表没子目录
					file.Seek(LtoP(load[nCount-1]),CFile::begin);
					file.Write(&list,sizeof(List));     //得到目录信息					
				}
			}
			file.SeekToBegin();
			file.Write(&byinfo,sizeof(byte)*128);  //修改文件
			strError->Format("成功删除%c%c%c.%c",name[0],name[1],name[2],name[4]);
			return TRUE;
		}
	}
	else                //否则不是目录中的首目录
	{
		byte nextindex;
		nextindex=byinfo[BIndex];     // 下一个兄弟目录的地址
		while(2<nextindex&&nextindex<=128)
		{
			file.Seek(LtoP(nextindex),CFile::begin);
			file.Read(&Nextlist,sizeof(List));
			if(3==Nextlist.type)//如果是文件类型 
			{
				
				if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2]&&Nextlist.postfix==name[4])
				{
					nextin=Nextlist.start;
					for(;nextin>2&&nextin<=128;)  //将分配给他的内容地址标为未用
					{	
						in=byinfo[nextin];
						byinfo[nextin]=0;
						nextin=in;
					}
					byinfo[BIndex]=byinfo[nextindex];
					byinfo[nextindex]=0;                //更改分配表信息
					file.SeekToBegin();
					file.Write(&byinfo,sizeof(byte)*128);  //修改文件
					strError->Format("成功删除%c%c%c.%c",name[0],name[1],name[2],name[4]);
					return TRUE;
					
				}
			}
			BIndex=nextindex;
			nextindex=byinfo[nextindex];
		}
		
	}
	
	strError->Format("没有找到文件:%c%c%c.%c",name[0],name[1],name[2],name[4]);
	return FALSE;
}

bool CDisk::Rdir(char name[3],CString * strError)     //删除空目录
{
	int nCount=load.GetSize();            //得到当前路径层数
	if(0==nCount)
	{
		strError->Format("根目录中不能删除目录");
		return FALSE;
	}
	
	if(1==nCount)
	{
		list=Rootlist[load[0]];           //得到目录信息
	}
	else
	{
		file.Seek(LtoP(load[nCount-1]),CFile::begin);
		file.Read(&list,sizeof(List));     //得到目录信息
	}
	
	if(2>=byinfo[list.start])           //如果目录为空
	{
		strError->Format("目录为空");
		return FALSE;
	}
	
	byte BIndex=list.start;        //保存当前起始地址,即他下一层的父地址
	List Nextlist;                       //保存他下一个目录;
	
	file.Seek(LtoP(list.start),CFile::begin);
	file.Read(&Nextlist,sizeof(List));       //读取第一个子目录信息;
	
	
	if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2])
		//如果是删除此目录,即第一个目录
	{
		if(2==Nextlist.type)           //如果是目录类型 
		{
			if(0!=Nextlist.start)      //如果不是空目录
			{
				strError->Format("%c%c%c不是空目录,不能删除",name[0],name[1],name[2]);
				return FALSE;
			}
			if(2<byinfo[BIndex]&&byinfo[BIndex]<=128)  //如果有兄弟目录
			{
				BIndex=byinfo[BIndex];          //BIndex存储其兄弟目录的地址
				file.Seek(LtoP(BIndex),CFile::begin);
				file.Read(&Nextlist,sizeof(List));
				file.Seek(LtoP(list.start),CFile::begin);
				file.Write(&Nextlist,sizeof(List));         //将其兄弟目录移动到目录起始地址
				
				byinfo[list.start]=byinfo[BIndex];  //修改分配表,将其兄弟指向的下一				                                        
				byinfo[BIndex]=0;					//个地址附给起目录指向的下一个地址.
			}
			else		//没有兄弟目录
			{
				byinfo[list.start]=0;  //清空目录
				if(2==list.type)      //如果是子目录,不是盘号
				{
					list.start=0;     //将目录起始地址清空,表没子目录
					file.Seek(LtoP(load[nCount-1]),CFile::begin);
					file.Write(&list,sizeof(List));     //得到目录信息					
				}
			}
			file.SeekToBegin();
			file.Write(&byinfo,sizeof(byte)*128);  //修改文件
			strError->Format("成功删除%c%c%c",name[0],name[1],name[2]);
			return TRUE;
		}
	}
	else                //否则不是目录中的首目录
	{
		byte nextindex;
		nextindex=byinfo[BIndex];     // 下一个兄弟目录的地址
		while(2<nextindex&&nextindex<=128)
		{
			file.Seek(LtoP(nextindex),CFile::begin);
			file.Read(&Nextlist,sizeof(List));
			if(2==Nextlist.type)//如果是文件类型 
			{
				if(0!=Nextlist.start)      //如果不是空目录
				{
					strError->Format("%c%c%c不是空目录,不能删除",name[0],name[1],name[2]);
					return FALSE;
				}
				
				if(Nextlist.name[0]==name[0]&&Nextlist.name[1]==name[1]&&Nextlist.name[2]==name[2])
				{
					byinfo[BIndex]=byinfo[nextindex];
					byinfo[nextindex]=0;                //更改分配表信息
					file.SeekToBegin();
					file.Write(&byinfo,sizeof(byte)*128);  //修改文件
					strError->Format("成功删除%c%c%c",name[0],name[1],name[2]);
					return TRUE;
					
				}
			}
			BIndex=nextindex;
			nextindex=byinfo[nextindex];
		}
		
	}
	
	strError->Format("没有找到目录:%c%c%c",name[0],name[1],name[2]);
	return FALSE;
}

bool CDisk::Deldir(byte index,CString *strError)      //删除非空或空目录的递归函数
{
	if(2>=index||index>128)       // 如果为无效地址
		return TRUE;

	if(byinfo[index]<=2)  //如果该地址没有用
		return TRUE;

	List newlist;
	file.Seek(LtoP(index),CFile::begin);
	file.Read(&newlist,sizeof(List));
	
	if(byinfo[index]<=128 && byinfo[index]>2)   //有兄弟目录
	{
		Deldir(byinfo[index],strError);  //先删除他兄弟目录
	}
	
	if(2==newlist.type)       //如果此为目录文件
	{
		Deldir(newlist.start,strError);     //删除其子目录
	}

	byinfo[index]=0;              //删除自己
	byte nextin,in;
	if(3==newlist.type)              //如果为文件
	{
		nextin=newlist.start;
		for(;nextin>2&&nextin<=128;)  //将分配给他的内容地址标为未用
		{	
			in=byinfo[nextin];
			byinfo[nextin]=0;
			nextin=in;
		}
	}
	return TRUE;
}

bool CDisk::Deldir(char name[3],CString * strError)     //删除非空或空目录
{
	if(!CD(name,strError))    //进入该目录,删除他所有子目录。
	{
		strError->Format("没有 %c%c%c 文件夹",name[0],name[1],name[2]);
		return FALSE;
	}
	
	int nCount=load.GetSize();
	byte index=load[nCount-1];
	List newlist;

	file.Seek(LtoP(index),CFile::begin);
	file.Read(&newlist,sizeof(List));
	
	Deldir(newlist.start,strError); //	删除其子目录
	newlist.start=0;
	file.Seek(LtoP(index),CFile::begin);
	file.Write(&newlist,sizeof(List));
	
	CD(".. ",strError);    //退出该目录;
	if(!Rdir(name,strError))   //删除该目录
		return FALSE;
	return TRUE;
}

bool CDisk::Type(char name[6],CString str,CString * strError)     //显示文件
{
	int nCount=load.GetSize(); //得到路径的长度
	
	if(0==nCount)              //在根目录下
	{
		strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
		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==name[4])
				{
					byte nextin;
					char ch[65]={0};
					file.Seek(LtoP(list.start),CFile::begin);	
					file.Read(ch,64);
					tydlg.m_str=ch;
					nextin=byinfo[list.start];
					for(;nextin>2&&nextin<=128;)
					{
						file.Seek(LtoP(nextin),CFile::begin);	
						file.Read(ch,64);
						tydlg.m_str+=ch;
						nextin=byinfo[nextin];
					}
					str=tydlg.m_str;
					*strError="";
					tydlg.DoModal();
					return TRUE;
				}
			}
			index=byinfo[index];
			if(index>128||index<=2)
				break;
		}
	}    //
	strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
	return TRUE;
}

bool CDisk::Edit(char name[6],CString * strError)       //编辑文件
{
	int nCount=load.GetSize(); //得到路径的长度
	
	if(0==nCount)              //在根目录下
	{
		strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
		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==name[4])
				{
					byte nextin,in;
					char ch[65]={0};
					file.Seek(LtoP(list.start),CFile::begin);	
					file.Read(ch,64);
					eddlg.m_str=ch;
					nextin=byinfo[list.start];
					byinfo[list.start]=255;
					for(;nextin>2&&nextin<=128;)
					{
						file.Seek(LtoP(nextin),CFile::begin);	
						file.Read(ch,64);
						eddlg.m_str+=ch;
						in=byinfo[nextin];
						byinfo[nextin]=0;
						nextin=in;
					}
					file.SeekToBegin();
					file.Write(byinfo,sizeof(byte)*128);
					CString old=eddlg.m_str;
					*strError="";
					if(IDOK!=eddlg.DoModal())
					{
						eddlg.m_str=old;
					}
					char *p;
					int strlength=eddlg.m_str.GetLength();
					int time=(strlength-1)/64;   //是大于64个字节多少倍
					int Ladd[3]={0};
					if(time>0)
					{
						if(!Seekroom(Rootlist[load.GetAt(0)].name[0],Ladd,time))
						{
							strError->Format("没有足够的空间,修改失败");
							return FALSE;
						}
					}
					file.Seek(LtoP(list.start),CFile::begin);
					p=eddlg.m_str.GetBuffer(64);
					file.Write(p,64);
					for(int j=0;j<time;j++)
					{
						if(0==j)
							byinfo[list.start]=Ladd[0];
						file.Seek(LtoP(Ladd[j]),CFile::begin);
						eddlg.m_str.Delete(0,64);
						if(j>0)
							byinfo[Ladd[j-1]]=Ladd[j];
						p=eddlg.m_str.GetBuffer(64);
						file.Write(p,64);						
					}
					if(j>0)
					{
						byinfo[Ladd[j-1]]=255;
						file.SeekToBegin();
						file.Write(byinfo,sizeof(byte)*128);
					}
					return TRUE;
				}
			}
			index=byinfo[index];
			if(index>128||index<=2)
				break;
		}
	}    //
	strError->Format("不能找到%c%c%c%c%c文件",name[0],name[1],name[2],name[3],name[4]);
	return FALSE;
}

⌨️ 快捷键说明

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