📄 page2.cpp
字号:
// 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 + -