?? 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表地址*/
//for(i=0;i<3;i++)
// printf("%d",fat[i].item);
//for(i=3;i<128;i++)
// printf("%c",fat[i].item);
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 Welcome to DOS File system! \r\n ---------------------------------------------------------------------------- \r\n \t\t 創建文件 create 文件名\r\n\t\t 刪除文件 delete 文件名\r\n\t\t 顯示文件 type 文件名\r\n\t\t 復制文件 copy (路徑)文件名 (路徑)文件名\r\n\t\t 編輯文件 edit\r\n\t\t 創建子目錄 mkdir 目錄名\r\n\t\t 刪除子目錄 deldir 目錄名\r\n\t\t 顯示當前目錄的子目錄 dir\r\n\t\t 移動文件 move (路徑)文件名 路徑\r\n\t\t 磁盤格式化 format\r\n\t\t 退出系統 halt\r\n\t\t 顯示幫助信息 help\r\n\n\n\tNotice:在輸入文本時,用 $ 字符作為空格, # 字符作為換行符\r\n---------------------------------------------------------------------------\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);
// 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";
}
else
{
/*for(i=0;i<flag;i++)
{
printf("%c",contect[i]);
}*/
contect[flag]='\0';
m_display+=contect;
m_display+="\r\n";
}
}
close(b);
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 3:/*-復制文件-*/
flag=0;
k=0;
for(j=0;j<strlen(a);)
if(a[j]!=' '&&flag==0) j++;
else if(flagz==0)
{
flag=1;
name1[k++]=a[++j];
if(a[j]==' ')
{
flagz=1;
name1[k]='\0';
k=0;
}
}
else
{
name2[k++]=a[++j];
}
name2[k]='\0';
/* m_display+=name1;
m_display+=" ";
m_display+=name2;
m_display+="\r\n";*/
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
copy(name1,name2);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 4:/*--編輯文件--*/
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 exist! \n Please create it first!\r\n";
else if(fd==-4)m_display+="Error:it's not a file,but a directory!\r\n";
else
{
m_display+="Please input the file contect:\r\n";
EditFile dlgInput;
if( dlgInput.DoModal() == IDOK )
{
// Create MIPS Pipeline dialog
UpdateData(TRUE);
this->SetActiveWindow();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -