?? page2.cpp
字號:
else
{
flag=write(fd,contect,strlen(contect));
if(flag == 0)
{
printf(" Copy successfully !\n");
}
else if(flag ==-1)
{
printf("Error:\n The disk size is not enough! \n");
}
else printf("The disk is not exist!");
}
close(name2);//關(guān)閉目的文件
if(flag1==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temdirect);
}
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*----------------------------------------創(chuàng)建文件----------------------------------------------*/
int CPage2::create(char *name)
{
int flag=0;
char *temdirect=(char*)malloc(sizeof(DIR_LENGTH));
char *t=(char*)malloc(5);
struct direct * temp_dir;
int i,j,r=0;
char extend=-1;
char name_temp[3]={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(name)-1;
while(i>=0&&name[i]!='\\')
i--;
if(i!=-1)
{
for(int temp_i=0;temp_i<=5;temp_i++)
if((name+i)!=NULL)
{
i++;
*(t+(temp_i))=*(name+i);
}
name[i-5]='\0';
i=0;
while(name[i]!='\0')
{
*(temdirect+i)=*(name+i);
i++;
}
*(temdirect+i)='\0';
flag=1;
}
else
{
for(i=0;i<=int(strlen(name));i++)
*(t+i)=*(name+i);
}
if(flag==1)
r=chdir(temdirect);
if((r==-1)||(r==-2)) return -7;
name=t;
//////////////////
for(i=0;i<5;)
if((name[i]!='.')&&name[i]!=NULL) { name_temp[i]=name[i];i++;}
else if (i==int(strlen(name)))
return -6;
else
{
i++;
if(name[i]!=NULL) extend=name[i];
break;
}
if(strlen(name)>5) /*文件名大于 5位(包括擴展名)*/
return(-1);
for(i=0;i<MSD;i++) /*找到第一個空閑子目錄*/
{
if(cur_dir->directitem[i].firstdisk=='F')
break;
}
for(j=0;j<MSD;j++) /*檢查創(chuàng)建文件是否與已存在的文件重名*/
{
int k=0;
while((k<3)&&(cur_dir->directitem[j].name[k]==name_temp[k])) k++;
if(k>2) k=-1;
if((k==-1)&&(cur_dir->directitem[j].extend_name==extend))
break;
}
if(i>=MSD) /*無空目錄項*/
{
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
return(-2);
}
if(u_opentable.cur_size>=MOFN) /*打開文件太多(第五層)*/
{
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
return(-3);
}
if(j<MSD) /*文件已經(jīng)存在*/
{
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
return(-4);
}
for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空閑盤塊 j 后退出*/
{
if(fat[j].item=='F')
break;
}
if(j>=DISK_NUM)
{
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
return(-5);
}
fat[j].item= 0; /*將空閑塊置為已經(jīng)分配*/
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);
}
}
/*-----------填寫目錄項-----------------*/
for(int k=0;k<3;k++) cur_dir->directitem[i].name[k]=name_temp[k];
cur_dir->directitem[i].firstdisk = j;
cur_dir->directitem[i].size=0;
cur_dir->directitem[i].property = '0';
cur_dir->directitem[i].extend_name=extend;
/*---------------------------------*/
/*------------把目錄項寫回磁盤--------------*/
if((fp=fopen("disk.dat","rb+"))==NULL)
{
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
printf("Error:\nCannot open file\n");
return -11;
}
fseek(fp,(curdir_block*64+8*i),0);
fwrite(&cur_dir->directitem[i],sizeof(struct FCB),1,fp);
/*修改fat狀態(tài)*/
char stat=0;
fseek(fp,j,0);
fwrite(&stat,1,1,fp);
fclose(fp);
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*----------------------------------------刪除文件----------------------------------------------*/
int CPage2::del(char *name)
{
CString strLine;
int flag=0;
char *temdirect=(char*)malloc(sizeof(DIR_LENGTH));
char *t=(char*)malloc(5);
struct direct * temp_dir;
int i,j,r=0;
char extend=-1;
char name_temp[3]={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(name)-1;
while(i>=0&&name[i]!='\\')
i--;
if(i!=-1)
{
for(int temp_i=0;temp_i<=5;temp_i++)
if((name+i)!=NULL)
{
i++;
*(t+(temp_i))=*(name+i);
}
name[i-5]='\0';
i=0;
while(name[i]!='\0')
{
*(temdirect+i)=*(name+i);
i++;
}
*(temdirect+i)='\0';
flag=1;
}
else
{
for(i=0;i<=int(strlen(name));i++)
*(t+i)=*(name+i);
}
if(flag==1)
r=chdir(temdirect);
if((r==-1)||(r==-2)) return -7;
name=t;
for(i=0;i<5;)
if((name[i]!='.')&&name[i]!=NULL) { name_temp[i]=name[i];i++;}
else if (i==int(strlen(name)))
return 0;
else
{
i++;
if(name[i]!=NULL) extend=name[i];
break;
}
if(strlen(t)>5) /*文件名大于 5位(包括擴展名)*/
return(-1);
for(j=0;j<MSD;j++) /*檢查創(chuàng)建文件是否與已存在的文件重名*/
{
int k=0;
while((k<3)&&(cur_dir->directitem[j].name[k]==name_temp[k])) k++;
if(k>2) k=-1;
if((k==-1)&&(cur_dir->directitem[j].extend_name==extend))
break;
}
if(j<MSD) /*文件已經(jīng)存在*/
{
i=j;
fat[j].item='F' ; /*將空閑塊置為已經(jīng)分配*/
/*-----------填寫目錄項-----------------*/
// strcpy(cur_dir->directitem[i].name,name_temp);
for(int k=0;k<3;k++)cur_dir->directitem[i].name[k]=' ';
cur_dir->directitem[i].firstdisk = 'F';
cur_dir->directitem[i].size=0;
cur_dir->directitem[i].property = '0';
cur_dir->directitem[i].extend_name=' ';
//printf("%c",cur_dir->directitem[i].extend_name);
/*---------------------------------*/
/*------------把目錄項寫回磁盤--------------*/
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 2;
}
fseek(fp,(curdir_block*64+8*i),0);
fwrite(&cur_dir->directitem[i],sizeof(struct FCB),1,fp);
/*修改fat狀態(tài)*/
char stat='F';
fseek(fp,j,0);
fwrite(&stat,1,1,fp);
fclose(fp);
// printf("%d",fd); //測試文件在文件打開表中的序號
if(flag==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
free(temp_dir);
}
}
fat[0].item=0;
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(R2_BLACK);
//pControlDC->Rectangle(hardisk_state[0].x1,hardisk_state[0].y1,hardisk_state[0].x2,hardisk_state[0].y2); //畫矩形
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);
}
}
return 1;
}
/*----------------------------------------------------------------------------------------------*/
/*-------------------------------顯示當前目錄的子目錄-------------------------------------------*/
void CPage2::dir()
{
CString strLine;
int i,j=0,k=0;
char a[10]={0};
char b;
char b1,b2;
for(i=0;i<MSD;i++)
{
j=0;
k=0;
if(cur_dir->directitem[i].firstdisk!='F') /*-如果存在子目錄-*/
{ /*-其本身和父目錄也算?-*/
while(j<3)
a[j]=cur_dir->directitem[i].name[j++];
a[j++]='\0';
m_display+=a;
// m_display+='\0';
j=0;
if(cur_dir->directitem[i].property=='0') /*-文件-*/
{
a[k++]='.';
a[k++]=cur_dir->directitem[i].extend_name;
a[k]='\0';
m_display+=a;
m_display+="\t\t";
b=cur_dir->directitem[i].size; //將一個數(shù)字值以ASCII形式表示為其數(shù)值 如將ASCII碼76,轉(zhuǎn)化為兩個ASCII碼,7+48和6+48就能輸出7與6
b1=b/10;
b1+=48;
b2=b%10;
b2+=48;
//m_display+=cur_dir->directitem[i].size;
m_display+=b1;
m_display+=b2;
m_display+="B\t\t\r\n";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDIT1)->SetWindowText(strLine);
}
else /*-目錄-*/
{
m_display+="\t\t<DIR>\t\r\n";
}
}
}
m_display+=bufferdir;
m_display+=">";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDITDIS)->SetWindowText(strLine);
}
/*---------------------------------------------------------------------------------------------*/
/*-----------------------------------------執(zhí)行可執(zhí)行文件--------------------------------------*/
exelist exe_lst,*l;
pointer p;
void CPage2::executive(char *contect, int num)
{
extern Status InitListexe(exelist *l);
extern Status InsertListexe(exelist*l,pointer p);
char Space = 32; /*SPACE的ASCII碼值*/
char Endter= '\n';
int i;
l=&exe_lst;
InitListexe(l);
for(i=0;i<num;)
{
if((contect[i] ==Space)||contect[i] == '\n')
{
i++;
}
else
{
p=(pointer)malloc(sizeof(exe));
for(int j=0;j<4;)
{
p->a[j++]=contect[i++];
if(j==3)p->a[j]='\0';
}
InsertListexe(l, p);
}
}
}
/*----------------------------------------------------------------------------------------------*/
/*---------------------------------------創(chuàng)建子目錄---------------------------------------------*/
int CPage2::mkdir(char *name)
{
int i,j;
struct direct *cur_mkdir;
int k;
if(strchr(name,'\\'))/*如果目錄名中有 '\'字符*/
return(-4);
if(!strcmp(name,"."))
return(-6);
if(!strcmp(name,".."))
return(-6);
if(strlen(name)>3) /*-如果目錄名長度大于 5位-*/
return(-1);
for(i=0;i<MSD;i++) /*-如果有空閑目錄項退出-*/
{
if((cur_dir->directitem[i].firstdisk=='F'))
break;
}
if(i>=MSD) /*-目錄/文件 已滿-*/
return(-2);
for(j=0;j<MSD;j++) /*-判斷是否有重名-*/
{
for(k=0;k<(int)strlen(name);)
{
if(cur_dir->directitem[j].name[k]==name[k]) k++;
else break;
if(k==(int)strlen(name)) {k=-1; break;}
}
if((cur_dir->directitem[j].property=='1')&&(k==-1))
break;
}
if(j<MSD) /*-如果有重名-*/
return(-3);
for(j=ROOT_DISK_NO;j<DISK_NUM;j++) /*-找到空閑磁盤塊 j 后退出-*/
{
if(fat[j].item=='F')
break;
}
if(j>=DISK_NUM)
return(-5);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -