page2.cpp
来自「一个内含进程管理、内存管理、文件管理的操作系统设计实现方案」· C++ 代码 · 共 1,899 行 · 第 1/4 页
CPP
1,899 行
// 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 + =
减小字号Ctrl + -
显示快捷键?