page2.cpp
来自「一个内含进程管理、内存管理、文件管理的操作系统设计实现方案」· C++ 代码 · 共 1,899 行 · 第 1/4 页
CPP
1,899 行
dlgInput.m_input+='\0';
m_display+="Finish Editing\r\n";
strcpy(contect,dlgInput.m_input);
flag=write(fd,contect,strlen(contect));
if(flag == 0) m_display+="Finish Editing\r\n";
else if(flag ==-1) m_display+="Error:\n The disk size is not enough!\r\n";
else m_display+="The disk is not exist!\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 5: /*-删除目录-*/
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';
rmdir(b);
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 6:/*--更改当前目录--*/
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';
flag = chdir(b);
if(flag == -1) m_display+="Error:\n The path is not correct!\r\n";
else if(flag == -2) m_display+="Error:\nThe opened is not direct!\r\n";
else if(flag == -3) m_display+="Error:\nThe '\\' is too much !\r\n";
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 7:/*---move文件--*/
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';
mov(name1,name2);
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 8: /*格式化磁盘*/
format();
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 9:///*-显示当前目录-*/
dir();
m_cmd.Empty();
UpdateData(FALSE);
break;
case 10: //*--创建子目录--/
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';
// strLine.Format("%d",strlen(b));
// GetDlgItem(IDC_EDIT1)->SetWindowText(strLine);
flag =mkdir(b);
if(flag == -1) m_display+="Error:\n The length of name 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 name is already in the direct ! \r\n";
else if(flag == -4) m_display+="Error:\n \\ can not in the name of a direct !\r\n";
else if(flag == -5) m_display+="Error:\n Error: \n The disk space is full!\r\n";
else if(flag == -6) m_display+="Error: \n '..' or '.' can not as the name of the direct!\r\n";
else if(flag == 0) m_display+="Successfully make dircet!!\r\n";
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
//case 11:/*-退出系统-*/
// free(contect); // return;
case 12:/*---显示帮助信息--*/
print();
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
case 14:/*----执行可执行文件---*/
fd = open(a); //打开所创建的文件
if(fd ==-1) m_display+="Error:\n The file is not opened !\r\n";
else if(fd==-2) m_display+="The file can't open !\r\n";
else
{
flag = read(fd,contect);
if(flag == -1) m_display+="Error: \n The size is over the length of the file!\r\n";
else executive(contect,flag);
}
close(a);
psw=3;
// executive();
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
default:
m_display+="ERROR: the command isn't exist!\r\n";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
m_cmd.Empty();
UpdateData(FALSE);
break;
}
//MessageBox("Get IT");
// add you code here
return true;
}
return CDialog::PreTranslateMessage(pMsg);
}
/*----------------------------------------------------------------------------------------------*/
/*---------------------------------------更改当前目录-------------------------------------------*/
int CPage2::chdir(char *name)
{
int i,j,k,item;
char *str,*str1;
char *temp;
CString strLine;
struct direct *temp_dir;
temp_dir=(struct direct *)malloc(sizeof(struct direct));
*temp_dir=*cur_dir; /*-先用临时目录代替当前目录-*/
str=name; /*-str用来记录下次查找的起始地址-*/
if((!strcmp("..",name))||(!strcmp(".",name)))
{
m_display+="Error:the two directories are not exist!\r\n";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
return 0;
}
else
{
if(!strcmp("\\",name)) /*如果输入"\" ,回根目录*/
{
cur_dir = root;
curdir_block=2;
strcpy(bufferdir,"Root:");
return 0;
}
j=0;
for(i=0;i<(int)strlen(str);i++)/*查找有两个连续是"\",即"\\",退出 */
{
if(name[i]=='\\')
{
j++;
if(j>=2)
{
return -3;
}
}
else
j=0;
}
if(name[0]=='\\') /*如果最后一个是"\" ,去掉这个"\"*/
{
*temp_dir = *root;
strcpy(bufferdir,"Root:");
str++;
}
if(str[strlen(str)-1] == '\\')
{
str[strlen(str)-1] = '\0';
}
str1=strchr(str,'\\'); /*-找到'\'字符的位置-*/
temp = (char *)malloc(4*sizeof(char));/*-为子目录的名字分配空间-*/
if((fp=fopen("disk.dat","rb"))==NULL)
{
m_display+="Error:\nCannot open file!\r\n";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
return -11;
}
while(str1!=NULL) /*-找到-*/
{
for(i=0;i<str1-str;i++)
{
temp[i]=str[i];
}
temp[i]='\0';
for(j=0;j<MSD;j++) /*-查找该子目录是否在当前目录中-*/
{
for(k=0;k<(int)strlen(temp);)
{
if(temp_dir->directitem[j].name[k]==temp[k]) k++;
else break;
if(k==(int)strlen(temp)) {k=-1; break;}
}
if((temp_dir->directitem[j].property=='1')&&(k==-1))
break;
}
if(j>=MSD) /*-不在当前目录-*/
return(-1);
item=temp_dir->directitem[j].firstdisk;
fseek(fp,item*DISKSIZE,0);
fread(temp_dir,sizeof(struct direct),1,fp);
str=str1+1;
str1=strchr(str,'\\');
}
for(i=0;i<(int)strlen(str);i++)
temp[i]=str[i];
temp[i]='\0';
for(j=0;j<MSD;j++) /*-查找该子目录是否在当前目录中-*/
{
for(k=0;k<(int)strlen(temp);)
{
if(temp_dir->directitem[j].name[k]==temp[k]) k++;
else break;
if(k==(int)strlen(temp)) {k=-1;break;}
}
if((temp_dir->directitem[j].property=='1')&&(k==-1))
break;
}
free(temp);/*释放申请的临时空间*/
if(temp_dir->directitem[j].property!='1') /*-打开的不是目录-*/
return(-2);
if(j>=MSD) /*-不在当前目录-*/
return(-1);
item=temp_dir->directitem[j].firstdisk;
/*-当前目录在磁盘中位置-*/
fseek(fp,item*DISKSIZE,0);
fread(temp_dir,sizeof(struct direct),1,fp);
fclose(fp);
}
if(name[0] !='\\')
bufferdir = strcat(bufferdir,"\\"); /*-修改当前目录-*/
bufferdir = strcat(bufferdir,name);
curdir_block=item;
cur_dir=temp_dir; /*-将当前目录确定下来-*/
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*----------------------------------------关闭文件----------------------------------------------*/
int CPage2::close(char *name)
{
int i;
for(i=0;i<MOFN;i++)
{
if(!strcmp(u_opentable.openitem[i].name,name))
break;
}
if(i>=MOFN) /*--文件没有打开-*/
return(-1);
/*-----------清空该文件的用户打开表项的内容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk ='F';
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;
fd = -1; //文件打开表的序号为 -1
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*---------------------------------------复制文件-----------------------------------------------*/
int CPage2::copy(char *name1, char *name2)
{
char *contect;
int flag;
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
int flag1=0;
char *temdirect=(char*)malloc(sizeof(DIR_LENGTH));
char *t=(char*)malloc(5);
struct direct * temp_dir;
int i,r=0;
char *bufferdir_temp=(char*)malloc(sizeof(DIR_LENGTH));
char curdir_block_temp;
for(i=0;i<=int(strlen(bufferdir));i++)
*(bufferdir_temp+i)=*(bufferdir+i);
curdir_block_temp=curdir_block;
temp_dir=(struct direct *)malloc(sizeof(struct direct));
*temp_dir=*cur_dir; /*-将当前目录确定下来-*/
i=strlen(name1)-1;
while(i>=0&&name1[i]!='\\')
i--;
if(i!=-1)
{
for(int temp_i=0;temp_i<=5;temp_i++)
if((name1+i)!=NULL)
{
i++;
*(t+(temp_i))=*(name1+i);
}
name1[i-5]='\0';
i=0;
while(name1[i]!='\0')
{
*(temdirect+i)=*(name1+i);
i++;
}
*(temdirect+i)='\0';
flag1=1;
}
else
{
for(i=0;i<=int(strlen(name1));i++)
*(t+i)=*(name1+i);
}
if(flag1==1)
r=chdir(temdirect);
if((r==-1)||(r==-2)) return -7;
name1=t;
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/*------------------------------把源文件读到 contect---------------------*/
contect = (char *)malloc(MAX_WRITE*sizeof(char));
fd = open(name1); //打开源文件
if(fd ==-1)
{
printf("Error:\n The file is not opened ! \n");
}
else if(fd==-2)
printf("The file can't open.");
else
{
flag = read(fd,contect);
*(contect+flag)='\0';
if(flag == -1)
{
printf("Error: \n The size is over the length of the file! \n");
}
else
{
}
}
close(name1);//关闭源文件
if(flag1==1)
{
for(i=0;i<=int(strlen(bufferdir_temp));i++)
*(bufferdir+i)=*(bufferdir_temp+i);
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-将当前目录确定下来-*/
}
////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
flag1=0;
r=0;
for(i=0;i<=int(strlen(bufferdir));i++)
*(bufferdir_temp+i)=*(bufferdir+i);
curdir_block_temp=curdir_block;
*temp_dir=*cur_dir; /*-将当前目录确定下来-*/
i=strlen(name2)-1;
while(i>=0&&name2[i]!='\\')
i--;
if(i!=-1)
{
for(int temp_i=0;temp_i<=5;temp_i++)
if((name2+i)!=NULL)
{
i++;
*(t+(temp_i))=*(name2+i);
}
name2[i-5]='\0';
i=0;
while(name1[i]!='\0')
{
*(temdirect+i)=*(name2+i);
i++;
}
*(temdirect+i)='\0';
flag1=1;
}
else
{
for(i=0;i<=int(strlen(name2));i++)
*(t+i)=*(name2+i);
}
if(flag1==1)
r=chdir(temdirect);
if((r==-1)||(r==-2)) return -7;
name2=t;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
/*--------------------------把contect的内容写到目的文件里--------------------*/
fd = open(name2); //打开目的文件
if(fd ==-1)
{
printf("Error:\n The file is not exist! \n Please create it first!\n");
}
else if(fd==-4) printf("Error:it's not a file,but a directory!\n");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?