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

📄 page2.cpp

📁 一个简单的操作系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// Page2.cpp : implementation file
//

#include "stdafx.h"
#include "Property5.h"
#include "Page2.h"
#include"Page1.h"
#include "exe.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#include "queue.h"
#include "file.h"
#include "EditFile.h"
/////////////////////////////////////////////////////////////////////////////
// CPage2 dialog
graph hardisk_state[128];
int disk_num1=0;
int color=-1;
  //CPage2 *pdlg;
CPage2::CPage2(CWnd* pParent /*=NULL*/)
	: CDialog(CPage2::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPage2)
	m_cmd = _T("");
	m_display = _T("");
	//}}AFX_DATA_INIT
	//pdlg=this;
}


void CPage2::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPage2)
	DDX_Text(pDX, IDC_EDITCMD, m_cmd);
	DDX_Text(pDX, IDC_EDITDIS, m_display);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPage2, CDialog)
	//{{AFX_MSG_MAP(CPage2)
	ON_BN_CLICKED(IDC_BOOTF, OnBootf)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPage2 message handlers
/*----------------------------------------------------------------------------------------------*/
/*------------------------------------------初始化文件系统--------------------------------------*/

void CPage2::initfile()
{
	format();
	 free(fdisk);
}
/*----------------------------------------------------------------------------------------------*/
/*--------------------------------进入文件系统--------------------------------------------------*/

void CPage2::enter()
{
	
	int i;

      fdisk = (char *)malloc((ROOT_DISK_SIZE+FATSIZE)*sizeof(char)); /*申请 fat表 和根目录空间*/

     if((fp=fopen("disk.dat","rb"))==NULL)
     {
          printf("Error:\nCannot open file\n");
          return;                                
     }
	 fseek(fp,0,0);
	 if(!fread(fdisk,192,1,fp))  /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/    
	{
          printf("Error:\nCannot read file\n");
          exit(0);  
	 }
	  fclose(fp);
     fat = (struct fatitem *)fdisk;  /*找到FAT表地址*/
	 
     root = (struct direct *)(fdisk+FATSIZE);/*找到根目录地址*/

    
     /*--------------初始化用户打开表------------------*/
     for(i=0;i<MOFN;i++)
     {
          strcpy(u_opentable.openitem[i].name,"");
          u_opentable.openitem[i].firstdisk ='F';
          u_opentable.openitem[i].size = 0;              
     }
     u_opentable.cur_size = 0;
     
     cur_dir = root; /*当前目录为根目录*/
	 curdir_block=ROOT_DISK_NO;
     bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char));
     strcpy(bufferdir,"Root:"); /*显示根目录为Root:*/ 

}
/*----------------------------------------------------------------------------------------------*/
/*------------------------------------------格式化----------------------------------------------*/


void CPage2::format()
{
	
	 int i;
 
     fdisk = (char *)malloc((ROOT_DISK_SIZE+FATSIZE)*sizeof(char)); /*申请 fat表 和根目录空间*/
	 fat = (struct fatitem *)fdisk; 
	 /*-----初始化FAT表------------*/

	 fat[0].item=1;/*存放 FAT表的磁盘块号*/
	 fat[1].item=0;
 
	 fat[ROOT_DISK_NO].item=0;  /*存放根目录的磁盘块号*/
	 for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
	 fat[i].item = 'F';
	 
	 root = (struct direct *)(fdisk+FATSIZE); /*根目录的地址*/
	 /*初始化目录*/
 
	 for(i=0;i<MSD;i++) /*-子目录初始化为空-*/
	 {
		  root->directitem[i].firstdisk ='F';
		  strcpy(root->directitem[i].name,"");
		  root->directitem[i].property = '0';
		  root->directitem[i].size =0;
		  root->directitem[i].extend_name=' ';  
	 }
 
	 if((fp = fopen("disk.dat","wb+"))==NULL)
	 {
		  printf("Error:\n Cannot open file \n");  
		  return;
	 }
	 fseek(fp,0,0);
	 if(fwrite(fdisk,192,1,fp)!=1) /*把文件分配表与根目录写入磁盘即前三块磁盘的内容*/  
	 {
		 printf("Error:\n File write error! \n");
	 }
	 fclose(fp);
	 cur_dir = root; /*当前目录为根目录*/
	 curdir_block=ROOT_DISK_NO;
     bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char));
     strcpy(bufferdir,"Root:"); /*显示根目录为Root:*/ 
	 color=-1;
	 OnPaint();
	 color=1;
	 for(disk_num1=0;disk_num1<128;disk_num1++)
	 {
		if(fat[disk_num1].item!='F') 
		{
		 	CWnd   *pWnd=GetDlgItem(IDC_STATE);   
          CDC   *pControlDC=pWnd->GetDC();   
          //pWnd->Invalidate();   
          //pWnd->UpdateWindow();
		  pControlDC->SelectStockObject(BLACK_BRUSH); 
		 pControlDC->Rectangle(hardisk_state[disk_num1].x1,hardisk_state[disk_num1].y1,hardisk_state[disk_num1].x2,hardisk_state[disk_num1].y2);   //画矩形
		 pWnd->ReleaseDC(pControlDC);   
		}
	 }

}


void CPage2::OnBootf() 
{
	// TODO: Add your control notification handler code here
	char ch;
	 int f=0;
	  CString strLine;
	  int x1=0,y1=0,x2=20,y2=20;
	  int x=x1,y=y1;
	  for(int i=0,j=0;i<128;i++)
	  {
		    j++;
			hardisk_state[i].x1=x1;
			hardisk_state[i].y1=y1;
			hardisk_state[i].x2=x2;
			hardisk_state[i].y2=y2;
			if(j%16==0)
			{   
				j=0;
                x1=x;
				x2=x1+20;
				y1=y+25;
				y=y1;
				y2=y1+20;
			}
			else 
			{
				x1+=25;
				x2=x1+20;
			}
	  }
	  OnPaint();
	 if((fp=fopen("disk.dat","rb"))==NULL)/*如果还没有进行格式化,则要格式化*/
	 {
		 m_display+="You have not format,Now create it for you!\r\n";
		 
		  strLine.Format("%s",m_display);
		 GetDlgItem(IDC_EDIT1)->SetWindowText(strLine);
		  ch='y';
		if(ch=='y')
		{
		   initfile();
		   m_display+="Successfully format!\r\n";
		   strLine.Format("%s",m_display);
		  GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
		}
		else 
		{
			return;
		}
		f=1;
	}
     if(f==1)  fclose(fp);
	 enter();
	 fat[0].item=0;
	 fat[1].item=1;
	 fat[2].item=0;
	  color=1;

	 for(disk_num1=0;disk_num1<128;disk_num1++)
	 {
		if(fat[disk_num1].item!='F') 
		{
		 	CWnd   *pWnd=GetDlgItem(IDC_STATE);   
          CDC   *pControlDC=pWnd->GetDC();   
          //pWnd->Invalidate();   
          //pWnd->UpdateWindow();
		  pControlDC->SelectStockObject(BLACK_BRUSH); 
		 pControlDC->Rectangle(hardisk_state[disk_num1].x1,hardisk_state[disk_num1].y1,hardisk_state[disk_num1].x2,hardisk_state[disk_num1].y2);   //画矩形
		 pWnd->ReleaseDC(pControlDC);   
		}
	 }
	// print();
	 //show();
	 //strcpy("********************************************************************************\n",m_display);
	 //strcat("\t\t\tWelcome to DOS File system!\n",m_display);
	 m_display+="***********************************************************************  \r\n \t\t DOS模拟系统 \r\n --------------------------------------------------------- \r\n \t\t 创建文件: create 文件名\r\n\t\t 删除文件:delete 文件名\r\n\t\t 显示文件:type 文件名\r\n\t\t 编辑文件:edit  文件名\r\n\t\t 创建子目录:mkdir 目录名\r\n\t\t 删除子目录:rmdir 目录名\r\n\t\t 显示当前目录的子目录:dir\r\n\t\t 改变目录路径:chdir 目录名 \r\n\t\t 显示帮助信息: help \r\n\t    ---------------------------------------------------------------------------\r\n";
		m_display+=bufferdir;
		m_display+=">";
	 strLine.Format("%s",m_display);
	  GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);

	 /*将命令全部保存在CODE数组中*/


}

BOOL CPage2::PreTranslateMessage(MSG* pMsg) 
{	// TODO: Add your specialized code here and/or call the base class
	 	  extern int psw;
	// TODO: Add your specialized code here and/or call the base class
		 if(   pMsg->hwnd   ==   GetDlgItem(IDC_EDITCMD)->m_hWnd   )   
          if(   pMsg->message   ==   WM_KEYDOWN   )   
              if(   pMsg->wParam   ==   VK_RETURN   )   
              {  
				
					char a[30];
					char b[30];
					 char name1[DIR_LENGTH],name2[DIR_LENGTH];
					 int i=0,flag=0,k,j;
					  char code[14][10];
					 char *contect;
					 int flagz=0;
					  CString strLine;
					  contect = (char *)malloc(MAX_WRITE*sizeof(char));
					// TODO: Add your control notification handler code here
					 strcpy(code[0],"create");//////////////////////////////////////
					 strcpy(code[1],"delete");
					 strcpy(code[2],"type");
					 strcpy(code[3],"copy");
					 strcpy(code[4],"edit");
					 strcpy(code[5],"rmdir");
					 strcpy(code[6],"chdir");
					 strcpy(code[7],"move");
					 strcpy(code[8],"format");
					 strcpy(code[9],"dir");
					 strcpy(code[10],"mkdir");
					 strcpy(code[11],"halt");
					 strcpy(code[12],"help");
					UpdateData(TRUE);
					strncpy(b,(LPCTSTR)m_cmd,sizeof(b));
					m_display+=b;
					m_display+="\r\n";
					while(b[i]!=' '&& i<strlen(b))
						a[i]=b[i++];
					a[i]='\0';
				//	 strLine.Format("%s",a);
				//	GetDlgItem(IDC_EDIT1)->SetWindowText(strLine); 
					
					for(i=0;i<13;i++)
					 {
						if(!strcmp(code[i],a))
						break;
					 }
					 if((a[1]=='.'&&a[2]=='e')||(a[1]=='.'&&a[2]=='e')||(a[2]=='.'&&a[3]=='e')||(a[3]=='.'&&a[4]=='e'))
						i=14;
					strcpy(a,b);


					CEdit*   edit   =(CEdit*)GetDlgItem(IDC_EDITDIS);   
	
			   // strLine.Format("%d",i);
				//GetDlgItem(IDC_EDIT1)->SetWindowText(strLine); 
				 switch(i)
					  {
						  case 0:/*-创建文件-*/
							  flag=0;
							  for(j=0,k=0;j<sizeof(a);)
								  if(a[j]!=' '&&flag==0) j++;
								  else
								  {
									flag=1;
									b[k++]=a[++j];
								  }
			    				b[k]='\0';
								 // strLine.Format("%d",strlen(b));
								//GetDlgItem(IDC_EDIT1)->SetWindowText(strLine);
							  flag = create(b);
							  if(flag==-1)  m_display+="Error: \n The length is too long !\r\n";
							  else if(flag==-2)  m_display+="Error: \n The direct item is already full !\r\n";
							  else if(flag==-3)  m_display+="Error: \n The number of openfile is too much !\r\n";
							  else if(flag==-4)  m_display+="Error: \n The name is already in the direct !\r\n";
							  else if(flag==-5)  m_display+="Error: \n The disk space is full!\r\n";
							  else if(flag==-6) m_display+="Error:the file has no extend name!\r\n";
							  else if(flag==-7) m_display+="Error:the directory is not exist!\r\n";
							  else m_display+="Successfully create a file! \r\n";
							  m_display+=bufferdir;
							m_display+=">";
							strLine.Format("%s",m_display);
							GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
							m_cmd.Empty();
							UpdateData(FALSE);
							 break;
						  case 1:/*-删除文件-*/
							 flag=0;
							 k=0;
							  for(j=0;j<strlen(a);)
								  if(a[j]!=' '&&flag==0) j++;
								  else
								  {
									flag=1;
									b[k++]=a[++j];
								  }
			    				b[k]='\0';
							
							 fd = open(b); //打开所创建的文件
							 flag=del(b);
							 if(flag==1)
							 {
									m_display+="Delete Successfully!";
									 m_display+="\r\n";
									 m_display+=bufferdir;
									m_display+=">";
									strLine.Format("%s",m_display);
									GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
							 }
							 close(b);
							 m_cmd.Empty();
							UpdateData(FALSE);
							 break;
						case 2:/*--读文件--*/
							 flag=0;
							 k=0;
							  for(j=0;j<strlen(a);)
								  if(a[j]!=' '&&flag==0) j++;
								  else
								  {
									flag=1;
									b[k++]=a[++j];
								  }
			    				b[k]='\0';
							 fd = open(b); //打开所创建的文件
							 if(fd ==-1)
							 {
					  				m_display+="Error:\n The file is not opened !";
									 m_display+="\r\n";	
									
							 }
							 else if(fd==-2)
							 {
								m_display+="The file can't open!";
								m_display+="\r\n";	
							 }
							 else
							 {
								flag = read(fd,contect);
								if(flag == -1)
								{ 
									m_display+="Error:  The size is over the length of the file! !";
									 m_display+="\r\n";	

⌨️ 快捷键说明

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