?? page2.cpp
字號:
fat[j].item=0; /*-將該空閑塊設置為已分配-*/
/*-------------填寫目錄項----------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk=j; /*-指向子目錄(其實就是其本身)的起始盤塊號-*/
cur_dir->directitem[i].size=ROOT_DISK_SIZE;
cur_dir->directitem[i].property='1';
/*-extend_name是文件擴展名,目錄沒有,這里可以省略-*/
/*-所創目錄在虛擬磁盤上的地址(內存物理地址)-*/
cur_mkdir=(struct direct *)malloc(sizeof(struct FCB));
/*-初始化目錄-*/
for( k=0;k<MSD;k++) /*-子目錄都初始化為空-*/
{
cur_mkdir->directitem[k].firstdisk ='F';
strcpy( cur_mkdir->directitem[k].name,"");
cur_mkdir->directitem[k].property = '0';
cur_mkdir->directitem[k].size =0;
cur_mkdir->directitem[k].extend_name=' ';
}
/*-----------------更新磁盤中fat表---------------------*/
if((fp=fopen("disk.dat","rb+"))==NULL)
{
printf("Error:\nCannot open file\n");
return -11;
}
fseek(fp,j,0);
fwrite(&fat[j].item,1,1,fp);
/*----------------更新當前目錄下的目錄項---------------*/
fseek(fp,(curdir_block*64+8*i),0);
fwrite(&cur_dir->directitem[i],sizeof(struct FCB),1,fp);
/*-----------------把新建目錄的目錄項寫入磁盤-----------*/
fseek(fp,(cur_dir->directitem[i].firstdisk*DISKSIZE),0);
fwrite(cur_mkdir,sizeof(struct direct),1,fp);
fclose(fp);
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*---------------------------------------復制文件-----------------------------------------------*/
int CPage2::mov(char *name1, char *name2)
{
int flag1=0;
char *temdirect=(char*)malloc(sizeof(DIR_LENGTH));
char * tem_name1=(char*)malloc(sizeof(3+name1));
char *t=(char*)malloc(5);
int i,r=0;
for(i=0;i<=int(strlen(name1));i++) *(tem_name1+i)=*(name1+i);
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);
}
}
else
for(i=0;i<=int(strlen(name1));i++) *(t+i)=*(name1+i);
if(name2[strlen(name2)-1]!='\\') strcat(name2,"\\");
strcat(name2,t);
for(i=0;i<=int(strlen(name2));i++) *(temdirect+i)=*(name2+i);
create(name2);
for(i=0;i<=int(strlen(name2));i++) *(name2+i)=*(temdirect+i);
copy(tem_name1,name2);
//////////////////////////////////////////////////////////////////////
////////////////////////////name1 的路徑與文件名///////////////////////////////////////
struct direct * temp_dir;
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;
del(t);
if(flag1==1)
{
bufferdir=bufferdir_temp;
curdir_block=curdir_block_temp;
*cur_dir=*temp_dir; /*-將當前目錄確定下來-*/
}
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*----------------------------------------打開文件----------------------------------------------*/
int CPage2::open(char *name)
{
int i, j;
char extend=' ';
char name_temp[3]={0};
for(i=0;i<5;)
if(name[i]!='.')
{
name_temp[i]=name[i];
i++;
}
else
{
i++;
extend=name[i];
break;
}
for(j=0;j<MSD;j++) /*檢查創建文件是否與已存在的文件重名*/
{
int k=0;
while((cur_dir->directitem[j].name[k]!=NULL)&&k<3)
k++;
if(k!=int(strlen(name)-2)) continue;
k=0;
while(k<int(strlen(name)-2))
{
if(cur_dir->directitem[j].name[k]==name_temp[k]) k++;
else break;
}
if(k>=int(strlen(name)-2)) k=-1;
if((k==-1)&&(cur_dir->directitem[j].extend_name==extend))
break;
}
if(j>=MSD) /*文件不存在*/
return(-1);
/*--------是文件還是目錄-----------------------*/
if(cur_dir->directitem[j].property=='1')/*是目錄,不可打開讀寫*/
return(-4);
i=j;
/*--------文件是否打開-----------------------*/
for(j=0;j<MOFN;j++)
{
if(!strcmp(u_opentable.openitem[j].name,name))
break;
}
if(j<MOFN) /*文件已經打開*/
return(-2);
if(u_opentable.cur_size>=MOFN) /*文件打開太多*/
return(-3);
/*--------查找一個空閑用戶打開表項-----------------------*/
for(j=0;j<MOFN;j++)
{
if(u_opentable.openitem[j].firstdisk=='F')
break;
}
/*--------------填寫表項的相關信息------------------------*/
u_opentable.openitem[j].firstdisk=cur_dir->directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size=cur_dir->directitem[i].size;
u_opentable.cur_size++;
/*----------返回用戶打開表表項的序號--------------------------*/
return(j);
}
void CPage2::print()
{
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";
}
/*----------------------------------------------------------------------------------------------*/
/*----------------------------------------讀文件------------------------------------------------*/
int CPage2::read(int fd, char *buf)
{
int len=u_opentable.openitem[fd].size;
int i,item,temp;
int ilen1, modlen;
item =u_opentable.openitem[fd].firstdisk;
if(len>u_opentable.openitem[fd].size) /*--欲讀出的文件長度比實際文件長度長-*/
return(-1);
ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--計算文件所占磁盤的塊數-*/
for(i=0;i<ilen1;i++)
{
if(i==ilen1-1) /*--如果在最后一個磁盤塊-*/
{
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return -2;
}
fseek(fp,item*64,0);
temp=len-i*DISKSIZE;
fread(&buf[i*DISKSIZE],temp,1,fp);
fclose(fp);
}
else /*--不在最后一塊磁盤塊-*/
{
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return -2;
}
fseek(fp,item*64,0);
fread(&buf[i*DISKSIZE],DISKSIZE,1,fp);
fclose(fp);
item = fat[item].item; /*-查找下一盤塊-*/
// first =fdisk+item*DISKSIZE;
/*CString strLine;
m_display+=buf;
m_display+="\r\n";
strLine.Format("%s",m_display);
GetDlgItem(IDC_EDIT1)->SetWindowText(strLine);*/
}
}
return len;
}
/*----------------------------------------------------------------------------------------------*/
/*---------------------------------------刪除子目錄---------------------------------------------*/
int CPage2::rmdir(char *name)
{
struct direct *temp_curdir;
int i,j;
int k,q,l;
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) /*-如果有重名-*/
{
i=j;
temp_curdir=(struct direct *)malloc(sizeof(struct direct));
q=cur_dir->directitem[i].firstdisk;
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return -11;
}
fseek(fp,q*64,0);
fread(temp_curdir,sizeof(struct direct),1,fp);
fclose(fp);
for(l=0;l<MSD;l++) if(temp_curdir->directitem[l].firstdisk!='F') break;
if(l<MSD)
{
printf("Error:the directory is not empty!\n");
return 0;
}
fat[q].item='F'; /*-將該空閑塊設置為已分配-*/
/*-------------填寫目錄項----------*/
for(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';
/*-extend_name是文件擴展名,目錄沒有,這里可以省略-*/
/*-----------------更新磁盤中fat表---------------------*/
if((fp=fopen("disk.dat","rb+"))==NULL)
{
printf("Error:\nCannot open file\n");
return -11;
}
fseek(fp,q,0);
fwrite(&fat[j].item,1,1,fp);
/*----------------更新當前目錄下的目錄項---------------*/
fseek(fp,(curdir_block*64+8*i),0);
fwrite(&cur_dir->directitem[i],sizeof(struct FCB),1,fp);
fclose(fp);
}
return 0;
}
/*----------------------------------------------------------------------------------------------*/
/*----------------------------------------寫文件------------------------------------------------*/
int CPage2::write(int fd, char *buf, int len)
{
char item1;
int i, j;
short ilen1, ilen2, modlen, temp;
/*----------用 $ 字符作為空格 # 字符作為換行符-----------------------*/
char Space = 32; /*SPACE的ASCII碼值*/
char Endter= '\n';
for(i=0;i<len;i++)
{
if(buf[i] == '$') /*用 $ 字符作為空格*/
buf[i] = Space;
else if(buf[i] == '#')
buf[i] = Endter;
}
/*----------讀取用戶打開表對應表項第一個盤塊號-----------------------*/
item1 = u_opentable.openitem[fd].firstdisk;
/*-------------找到當前目錄所對應表項的序號-------------------------*/
for(i=0;i<MSD;i++)
{
if(cur_dir->directitem[i].firstdisk==item1)
break;
}
temp = i; /*-存放當前目錄項的下標-*/
/*------找到的item 是該文件的最后一塊磁盤塊-------------------*/
//printf("%d\n",fat[item1].item);
while((fat[item1].item!='F') &&fat[item1].item>2) //fat[item1].item>2這個很重要
{
item1=fat[item1].item; /*-查找該文件的下一盤塊--*/
}
/*-----計算除該文件的最末地址-------*/
// first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
if((fp=fopen("disk.dat","rb+"))==NULL)
{
printf("Error:\nCannot open file\n");
return -11;
}
/*-----如果最后磁盤塊剩余的大小大于要寫入的文件的大小,把內容寫回磁盤-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)
{
fseek(fp,item1*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE,0); //計算除該文件的最末地址:item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE
fwrite(buf,len,1,fp);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len; //修改文件打開表
/*----------修改目錄項,并寫入磁盤------------------*/
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
fseek(fp,curdir_block*64+temp*8+6,0);
fwrite(&cur_dir->directitem[temp].size,2,1,fp);
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*寫一部分內容到最后一塊磁盤塊的剩余空間(字節)*/
fseek(fp,item1*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE,0);
fwrite(buf,(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE),1,fp);
}
/*-----計算分配完最后一塊磁盤的剩余空間(字節) 還剩下多少字節未存儲-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if(modlen>0)
ilen2 = ilen2+1; /*--還需要多少塊磁盤塊-*/
/*調試時特別注意*/
for(j=0;j<ilen2;j++)
{
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*尋找空閑磁盤塊*/
{
if(fat[i].item=='F')
break;
}
if(i>=DISK_NUM) /*--如果磁盤塊已經分配完了-*/
return(-1);
if(j==ilen2-1) /*--如果是最后要分配的一塊-*/
{
fseek(fp,i*DISKSIZE,0);
fwrite(&buf[DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE+j*DISKSIZE],modlen,1,fp);
}
else/*-如果不是要最后分配的一塊--*/
{
fseek(fp,i*DISKSIZE,0);
fwrite(&buf[DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE+j*DISKSIZE],DISKSIZE,1,fp);
}
/*-------------更新FAT表-----------------------------*/
fat[item1].item = i; /*--找到一塊后將它的序號存放在上一塊的指針中-*/
fat[i].item = 0; /*--它的指針為 0 (即沒有下一塊)-*/
fseek(fp,item1,0);
fwrite(&fat[item1].item ,1,1,fp);
fseek(fp,i,0);
fwrite(&fat[i].item,1,1,fp);
item1=i;
}
/*--修改文件打開表用戶的長度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
/*--修改目錄項的文件長度,并寫回磁盤-*/
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
fseek(fp,curdir_block*64+temp*8+6,0);
fwrite(&cur_dir->directitem[temp].size,2,1,fp);
}
fclose(fp);
return 0;
}
void CPage2::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd *pWnd=GetDlgItem(IDC_STATE);
CDC *pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
if(color==-1)
{
pControlDC->SelectStockObject(R2_BLACK);
for(int i=0;i<128;i++)
pControlDC->Rectangle(hardisk_state[i].x1,hardisk_state[i].y1,hardisk_state[i].x2,hardisk_state[i].y2); //畫矩形
}
else
{
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);
// Do not call CDialog::OnPaint() for painting messages
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -