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

📄 fs.cpp

📁 这是一个在C环境下编写的操作系统课程设计 包含了内存管理 CPU管理 文件管理 设备管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		AfxMessageBox("目录非空,删除失败!");
		return;
	}

	CFile file;
	if(file.Open("mydisk.txt",
		CFile::modeReadWrite|CFile::shareExclusive)!=0)
	{
		
		int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
		char name[4];
		CString tempname;
		tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
		name[0]=tempname.GetAt(0);
		name[1]=tempname.GetAt(1);
		name[2]=tempname.GetAt(2);
		name[3]='\0';
		file.Seek(n*64,CFile::begin);
		char str[9];
		for(int i=0;i<8;i++)
		{
			file.Read(str,8);
			char str1[4];
			str1[0]=str[0];
			str1[1]=str[1];
			str1[2]=str[2];
			str1[3]='\0';
			if(strcmp(str1,name)==0)
				break;
		}
		int position=i;
		fat[curdir.first]='0';
		file.Seek(curdir.first,CFile::begin);
		file.Write("0",1);
		file.Seek(n*64+position*8,CFile::begin);
		file.Write("||||||||",8);
		file.Seek(curdir.first*64,CFile::begin);
		file.Write("||||||||",8);
		file.Close();

		//画扇区
		int radius=30;
		radius=30+int(curdir.first/8)*8;
		int begin,end;
		begin=curdir.first%8;
		end=curdir.first%8+1;
		DrawCircle(radius,begin,end,0);

    	((COSDlg*)AfxGetMainWnd())->m_tree1.DeleteItem(hItem);

	}else
	{
		AfxMessageBox("打开文件失败 2");
		return ;
	}


}

void CFS::CreatFile()
{
	CFileCreatDlg dlg;
	if(dlg.DoModal()==IDOK)
	{
		if(dlg.m_edit1.GetLength()!=3)
		{
			AfxMessageBox("文件名为三个字符");
			return ;
		}
		if(dlg.m_edit2.GetLength()!=2)
		{
			AfxMessageBox("扩展名为两个字符");
			return ;
		}
		
		char fname[4],fext[3];
		int filelength;
		int charlength;
		char temp[2]={'\0','\0'};
		fname[0]=dlg.m_edit1.GetAt(0);
		fname[1]=dlg.m_edit1.GetAt(1);
		fname[2]=dlg.m_edit1.GetAt(2);
		fname[3]='\0';
		fext[0]=dlg.m_edit2.GetAt(0);
		fext[1]=dlg.m_edit2.GetAt(1);
		fext[3]='\0';
		
		charlength=dlg.m_edit3.GetLength();
		filelength=int(ceil(dlg.m_edit3.GetLength()/64.000000));
		
		CFile file;
		if(file.Open("mydisk.txt",
			CFile::modeReadWrite|CFile::shareExclusive)!=0)
		{
			//position,目录项号
			int position;
			//sonfirst,起始盘块号
			int subfirst;
			for(int i=0;i<8;i++)
			{
				if(strcmp(subdirname[i],fname)==0)
				{
					AfxMessageBox("重名错误");
					return;
				}
			}
			for(i=0;i<8;i++)
			{
				if(strcmp(subdirname[i],"|||")==0)
					break;
			}
			if(i==8)
			{
				AfxMessageBox("不能再创建文件或目录");
				return;
			}
			//position,目录项号
			position=i;
			strcpy(subdirname[i],fname);
			if(filelength!=0)
			{
				int blocknum;
				blocknum=filelength;
				int blocks[4];
				int j=0;
				for(i=3;i<128;i++)
				{
					if(fat[i]=='0')
					{
						blocks[j]=i;	
						j++;
					}
					if(j==blocknum)
						break;
				}
				if(j!=blocknum)
				{
					AfxMessageBox("磁盘满");
					return;
				}
				subfirst=blocks[0];
				
				//写FAT数组及磁盘
				for(i=0;i<blocknum-1;i++)
				{
					fat[blocks[i]]='0'+blocks[i+1];
				}
				fat[blocks[blocknum-1]]='*';
				for(i=0;i<blocknum;i++)
				{
					file.Seek(blocks[i],CFile::begin);
					temp[0]=fat[blocks[i]];
					file.Write(temp,1);
				}
				
				//写目录项
				
				file.Seek(curdir.first*64+position*8,CFile::begin);
				file.Write(fname,3);
				file.Write(fext,2);
				temp[0]='1';
				file.Write(temp,1);
				temp[0]=subfirst+'0';
				file.Write(temp,1);
				temp[0]=filelength+'0';
				file.Write(temp,1);
				
				//画扇区
				int radius=30;
				for(i=0;i<blocknum;i++)
				{
					radius=30+int(blocks[i]/8)*8;
					int begin,end;
					begin=blocks[i]%8;
					end=blocks[i]%8+1;
					DrawCircle(radius,begin,end,1);
				}
				
				
				//写文件内容
				char buf[65];
				for(i=0;i<blocknum-1;i++)
				{
					for(int j=0;j<64;j++)
						buf[j]=dlg.m_edit3.GetAt(i*64+j);
					buf[64]='\0';
					file.Seek(64*blocks[i],CFile::begin);
					file.Write(buf,64);
				}
				int len=charlength%64; 
				for(i=0;i<len;i++)
					buf[i]=dlg.m_edit3.GetAt((blocknum-1)*64+i);
				buf[len]='*';
				buf[len+1]='\0';
				file.Seek(64*blocks[blocknum-1],CFile::begin);
				file.Write(buf,len+1);
				file.Close();
			}else
			{
				//写目录项
				file.Seek(curdir.first*64+position*8,CFile::begin);
				file.Write(fname,3);
				file.Write(fext,2);
				temp[0]='1';
				file.Write(temp,1);
				temp[0]=0+'0';
				file.Write(temp,1);
				temp[0]=filelength+'0';
				file.Write(temp,1);
				file.Close();
			}
			
			//向目录树添加项目
			HTREEITEM hItem,hItem0;
			hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
			TVINSERTSTRUCT tvItem;
			tvItem.hParent=hItem;
			tvItem.hInsertAfter=TVI_LAST;
			tvItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
			tvItem.item.iImage=tvItem.item.iSelectedImage=2;
			char str1[7];
			strcpy(str1,fname);
			strcat(str1,".");
			strcat(str1,fext);
			str1[6]='\0';
			tvItem.item.pszText=str1;
			hItem0=((COSDlg*)AfxGetMainWnd())->m_tree1.InsertItem(&tvItem);
			
			((COSDlg*)AfxGetMainWnd())->m_tree1.SetItemData(hItem0,curdir.first);
			
			((COSDlg*)AfxGetMainWnd())->m_tree1.Expand(hItem,TVE_EXPAND);
		}else
		{
			AfxMessageBox("打开文件失败 3");
			return;
		}
	}

}

void CFS::DeleteFile()
{
	HTREEITEM hItem;
	hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
	CFile file;
	if(file.Open("mydisk.txt",
		CFile::modeReadWrite|CFile::shareExclusive)!=0)
	{
		
		int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
		char name[4];
		CString tempname;
		tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
		name[0]=tempname.GetAt(0);
		name[1]=tempname.GetAt(1);
		name[2]=tempname.GetAt(2);
		name[3]='\0';
		file.Seek(n*64,CFile::begin);
		char str[9];
		for(int i=0;i<8;i++)
		{
			file.Read(str,8);
			char str1[4];
			str1[0]=str[0];
			str1[1]=str[1];
			str1[2]=str[2];
			str1[3]='\0';
			if(strcmp(str1,name)==0)
				break;
		}
		int position=i;
		if(curdir.length==0)
		{
			
			file.Seek(n*64+position*8,CFile::begin);
			file.Write("||||||||",8);
			file.Close();

			((COSDlg*)AfxGetMainWnd())->m_tree1.DeleteItem(hItem);
		}else
		{
			
			int blocks[4];
			char temp[2]={'\0','\0'};
			temp[0]=curdir.first+'0';
			int i=0;
			do
			{
				blocks[i]=temp[0]-'0';
				file.Seek(blocks[i],CFile::begin);
				file.Read(temp,1);
				i++;
			}while(temp[0]!='*');//也可使用curdir.length和for循环
			int blocknum=i;

			//覆盖目录项,该项要先做
			file.Seek(n*64+position*8,CFile::begin);
			file.Write("||||||||",8);
			

			//写FAT数组和FAT磁盘
			for(i=0;i<blocknum;i++)
			{
				fat[blocks[i]]='0';
				file.Seek(blocks[i],CFile::begin);
				file.Write("0",1);
			}

			//释放磁盘扇区
			char buf[65];
			for(i=0;i<64;i++)
				buf[i]='|';
			buf[64]='\0';
			for(i=0;i<blocknum;i++)
			{
				file.Seek(64*blocks[i],CFile::begin);
				file.Write(buf,64);
			}
			file.Close();

			
			//画扇区
			int radius=30;
			int begin,end;
			for(i=0;i<blocknum;i++)
			{
				radius=30+int(blocks[i]/8)*8;
				begin=blocks[i]%8;
				end=blocks[i]%8+1;
				DrawCircle(radius,begin,end,0);
			}

			((COSDlg*)AfxGetMainWnd())->m_tree1.DeleteItem(hItem);
			
		}
	}else
	{
		AfxMessageBox("打开文件失败 4");
		return ;
	}
}

void CFS::TypeFile()
{
	HTREEITEM hItem;
	hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
	CFile file;
	if(file.Open("mydisk.txt",
		CFile::modeReadWrite|CFile::shareExclusive)!=0)
	{
		
		int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
		char name[4];
		CString tempname;
		tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
		name[0]=tempname.GetAt(0);
		name[1]=tempname.GetAt(1);
		name[2]=tempname.GetAt(2);
		name[3]='\0';
		file.Seek(n*64,CFile::begin);
		char str[9];
		for(int i=0;i<8;i++)
		{
			file.Read(str,8);
			char str1[4];
			str1[0]=str[0];
			str1[1]=str[1];
			str1[2]=str[2];
			str1[3]='\0';
			if(strcmp(str1,name)==0)
				break;
		}
		int position=i;
		if(curdir.length==0)
		{
			AfxMessageBox("文件现在为空");
			return;
		}else
		{
			int blocks[4];
			char temp[2]={'\0','\0'};
			temp[0]=curdir.first+'0';
			int i=0;
			do
			{
				blocks[i]=temp[0]-'0';
				file.Seek(blocks[i],CFile::begin);
				file.Read(temp,1);
				i++;
			}while(temp[0]!='*');//也可使用curdir.length和for循环
			int blocknum=i;
			char buf[65];
			CString content,add;
			content="";
			for(i=0;i<blocknum-1;i++)
			{
				file.Seek(64*blocks[i],CFile::begin);
				file.Read(buf,64);
				buf[64]='\0';
				add.Empty();
				add.Format("%s",buf);
				content+=add;
			}
			file.Seek(64*blocks[blocknum-1],CFile::begin);
			for(i=0;i<64;i++)
			{
				file.Read(temp,1);
				if(temp[0]=='*')
					break;
			    buf[i]=temp[0];	
			}
			buf[i]='\0';
			add.Empty();
			add.Format("%s",buf);
			content+=add;
			CFileType dlg;
			dlg.m_edit1=content;
			dlg.DoModal();

			file.Close();
		}
	}

}

bool CFS::ReadCommandFile(CString &name, CString **command, int &num)
{
	HTREEITEM hItem;
	hItem=((COSDlg*)AfxGetMainWnd())->m_tree1.GetSelectedItem();
	CFile file;
	if(file.Open("mydisk.txt",
		CFile::modeReadWrite|CFile::shareExclusive)!=0)
	{
		
		int n=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemData(hItem);
		char fname[4];
		char fext[3];
		CString tempname;
		tempname=((COSDlg*)AfxGetMainWnd())->m_tree1.GetItemText(hItem);
		fname[0]=tempname.GetAt(0);
		fname[1]=tempname.GetAt(1);
		fname[2]=tempname.GetAt(2);
		fname[3]='\0';
		file.Seek(n*64,CFile::begin);
		char str[9];
		for(int i=0;i<8;i++)
		{
			file.Read(str,8);
			char str1[4];
			str1[0]=str[0];
			str1[1]=str[1];
			str1[2]=str[2];
			str1[3]='\0';
			if(strcmp(str1,fname)==0)
				break;
		}
		int position=i;
		fext[0]=str[3];
		fext[1]=str[4];
		fext[2]='\0';
		if(strcmp(fext,"ex")!=0&&strcmp(fext,"EX")!=0)
		{
			AfxMessageBox("请添加扩展名为\".ex\"的文件");
			return 0;
		}
		if(curdir.length==0)
		{
			AfxMessageBox("文件现在为空");
			return 0;
		}else
		{
			int blocks[4];
			char temp[2]={'\0','\0'};
			temp[0]=curdir.first+'0';
			int i=0;
			do
			{
				blocks[i]=temp[0]-'0';
				file.Seek(blocks[i],CFile::begin);
				file.Read(temp,1);
				i++;
			}while(temp[0]!='*');//也可使用curdir.length和for循环
			int blocknum=i;
			char buf[65];
			CString content,add;
			content="";
			for(i=0;i<blocknum-1;i++)
			{
				file.Seek(64*blocks[i],CFile::begin);
				file.Read(buf,64);
				buf[64]='\0';
				add.Empty();
				add.Format("%s",buf);
				content+=add;
			}
			file.Seek(64*blocks[blocknum-1],CFile::begin);
			for(i=0;i<64;i++)
			{
				file.Read(temp,1);
				if(temp[0]=='*')
					break;
			    buf[i]=temp[0];	
			}
			buf[i]='\0';
			add.Empty();
			add.Format("%s",buf);
			content+=add;

			file.Close();

			name.Format("%s",fname);
			*command=new CString[50];
			int charlength=content.GetLength();
			int j=-1;
			int flag=1;
		    do{
				j++;
				if(j*4+3>charlength)
				{
					flag=0;
					break;
				}
		    	(*command)[j].Format("%c%c%c%c",
					content.GetAt(j*4+0),content.GetAt(j*4+1),
					content.GetAt(j*4+2),content.GetAt(j*4+3));
		        (*command)[j].MakeLower();
				if((*command)[j].GetAt(3)!=';')
				{
					flag=0;
					break;
				}
			}while((*command)[j]!="end;");
			num=j;
			if((*command)[j]!="end;")
				flag=0;
			if(flag==0)
			{
			//	delete []command;
				AfxMessageBox("命令文件有误,请检查\n  或仔细阅读帮助");
				return 0;
			}
			if(j>0)
				return 1;
			else return 0;
		}
	}
	return 0;
}

⌨️ 快捷键说明

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