⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page2.cpp

📁 一个简单的操作系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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++) /*检查创建文件是否与已存在的文件重名*/
    {
		 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)     /*文件已经存在*/
	{ 
	   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;  /*将空闲块置为已经分配*/
	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状态*/
   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++) /*检查创建文件是否与已存在的文件重名*/
    {
		 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)     /*文件已经存在*/
	{   
		i=j;
		fat[j].item='F' ; /*将空闲块置为已经分配*/
		/*-----------填写目录项-----------------*/
		// 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状态*/
	   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;   //将一个数字值以ASCII形式表示为其数值  如将ASCII码76,转化为两个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); 
}
/*---------------------------------------------------------------------------------------------*/
/*-----------------------------------------执行可执行文件--------------------------------------*/
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);
		}
	}
}
/*----------------------------------------------------------------------------------------------*/
/*---------------------------------------创建子目录---------------------------------------------*/

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;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -