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

📄 main.cpp

📁 操作系统课程设计 模拟unix文件系统 心血
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				BWriteArr(dir,iNode->iaddr[10]);
			if(left>0){								//二级索引
				short k=512;
				short j=512;		 
				short dirChild[512];
					iNode->iaddr[11]=AssAnEmpty();
					while(left&&k){					//二级索引1次寻址
						dir[512-k]=AssAnEmpty();
						while(left&&j){				//二级索引二次寻址
							dirChild[512-j]=AssAnEmpty();
				
							left--;
							j--;
						}
						if(j!=0)
						dir[512-j+1]=-1;			//标志二级索引二次寻址结束
						BWriteArr(dirChild,dir[512-k]);
						BWriteArr(dir,iNode->iaddr[11]);//写二级索引一次寻址中盘快记录的一次寻的盘快号
						k--;	
					}

			if(k!=0)
			dir[512-k+1]=-1;//标志文件结束
			}
			
		}
}

//================================================================
//函数描述:清空iNode信息,并分配磁盘空间
//入口参数:无
//返回值: 无  AssAnEmpty(),BWrite(dirChild,dir[512-i])未实现
//===============================================================
void CleanINode(INode *iNode){
			iNode->fileSpec=PIP;
			iNode->linkCount=-1;
			iNode->fileLength=-1;
			//根据文件长度非配文件磁盘节点
			//直接寻址
			for(short i=0;i<13;i++)
				iNode->iaddr[i]=-1;
		

}
//================================================================
//函数描述:创建一个iNode,并分配磁盘空间
//入口参数:无
//返回值: 无
//===============================================================
void InsertDir(DirNode *currDir,char fileName[14],short blockNum){
	strcpy(currDir->childItem[currDir->DirCount].filename,fileName);
	currDir->childItem[currDir->DirCount].i_BNum=blockNum;
	currDir->DirCount++;
	
	return;
}

//================================================================
//函数描述:存在文件,并分配iNOde节点和磁盘空间
//入口参数:无
//返回值: 无
//===============================================================
void Create(DirNode *currDir,char fileName[14],INode *iNode,short length,FileSpec fileSpec){
		int blockNum;
		if(length>freeTotalB){
					cout<<"当前文件超出长度"<<endl;
					return;
			}
			CreateINode(iNode,fileSpec,0,length);
			blockNum=AssAnEmpty();//分配一个空余磁盘存储iNOde
			InsertDir(currDir,fileName,blockNum);
			BWrite(iNode,blockNum);
			CleanINode(iNode);
			BWrite(currDir,currDirNum);//此处
}

//================================================================
//函数描述:创建一个文件,
//入口参数:无
//返回值: 无
//===============================================================
void Mf(DirNode *currDir,char fileName[14],INode *iNode,short length){	
	
	  int blockNum=IsFileExist(currDir,fileName);
	  if(blockNum!=-1){//有重名名,进一步判断
		  if(IsFile(iNode,blockNum))
			  cout<<"当前文件已经存在,请重新输入文件名"<<endl;		 
		  } else{//存在文件,为索引文件,或者无重名现象,创建文件,并分配iNOde节点和磁盘空间
		 // BRead(iNode,1059);//此处出错
			Create(currDir,fileName,iNode,length,NORMAL);
			}

		  
		  
}
//================================================================
//函数描述:在当前目录创建一个子目录
//入口参数:无
//返回值: 无
//===============================================================
void Md(DirNode *currDir,char fileName[14],INode *iNode,short length){	
	
	  int blockNum=IsFileExist(currDir,fileName);
	  if(blockNum!=-1){//有重名名,进一步判断
		  if(IsDir(iNode,blockNum))
			  cout<<"当前目录已经存在,请重新输入目录名"<<endl;		 
		  } else{//存在文件但为普通文件,或者无重名现象。创建文件,并分配iNOde节点和磁盘空间
			Create(currDir,fileName,iNode,length,DIR);
			CleanINode(iNode);
			}

		 		  
}//================================================================
//函数描述:打开一个文件,
//入口参数:无
//返回值: 无
//===============================================================	
void ShowBlockInfo(INode *iNode){

					short dir[512];

		
		
			short i;
			i=10;
			short left=iNode->fileLength;
			while(left&&i){
				cout<<(iNode->fileLength-left)<<":"<<iNode->iaddr[10-i]<<"  ";
				left--;
				i--;		
			}
			if(left>0){
				i=512;
				short dir1[512];
				BReadArr(dir1,iNode->iaddr[10]);
				while(left&&i){
					cout<<(iNode->fileLength-left)<<":"<<dir1[512-i]<<"  ";
					i--;
					left--;
				}
			}

		

			if(left>0){								//二级索引
				short k=512;
				short j=512;

					
		 
				short dirChild[512];
				BReadArr(dir,iNode->iaddr[11]);
				while(left&&k){					//二级索引1次寻址
					BReadArr(dirChild,dir[512-k]);
					while(left&&j){				//二级索引二次寻址
						cout<<(iNode->fileLength-left)<<":"<<dirChild[512-j]<<"  ";
						left--;
						j--;
					}
				k--;	
				}

			}
			
}

//================================================================
//函数描述:打开一个文件,
//入口参数:无
//返回值: 无
//===============================================================	
void ShowFileInfo(INode *iNode,char fileName[14]){
	cout<<"文件名        "<<fileName; 
	cout<<"      文件类型  ";
	switch(iNode->fileSpec){
	case NORMAL:
		cout<<"< 文件 > ";
		break;
	case DIR:
		cout<<"< 目录 > ";break;
	case BLOCK:
		cout<<"< INode节点 > ";break;
	case PIP:
		cout<<"管道  ";break;
	}
		cout<<"         "<<iNode->fileLength<<"KB"<<endl;
}
//================================================================
//函数描述:打开一个文件,
//入口参数:无
//返回值: 无
//===============================================================
void Open(DirNode *currDir,char fileName[14],INode *iNode){	
	
	  int blockNum=IsFileExist(currDir,fileName);
	  if(blockNum==-1){//不存在该文件,退出
		  cout<<"该文件按不存在"<<endl;
		  return;
	  }
	else{				
		if(IsFile(iNode,blockNum)){

						ShowFileInfo(iNode,fileName);
						ShowBlockInfo(iNode);
					}
				} 
		  
		  
}
//================================================================
//函数描述:回收一块空余磁盘片
//入口参数:无
//返回值: 无
//===============================================================
void CallBackOne(short diskNum){
	freeTotalB++;
	if(SS[0]<=49){
		SS[0]++;
		SS[SS[0]]=diskNum;		
	}else{//SS[0]==50
		BWrite(SS,freeBlockNum);	//将空白的一组回写到上一组记录空闲盘快号的磁盘
		freeBlockNum=SS[1];		//将当前空白的一组第一个盘快作为下一个盘组的记录盘
		//修改超级栈
		SS[1]=diskNum;
		SS[0]=1;
		
	}
	
	
}

//================================================================
//函数描述:回收文件占用的磁盘
//入口参数:无
//返回值: 无
//===============================================================
void CallBackDisk(INode *iNode){


					
			short i;
			i=10;
			short left=iNode->fileLength;


			while(left&&i){//直接索引回收
				CallBackOne(iNode->iaddr[10-i]);
				left--;
				i--;		
			}
			if(left>0){	//一级索引回收
				i=512;
				short dir1[512];
				BReadArr(dir1,iNode->iaddr[10]);
				while(left&&i){
					CallBackOne(dir1[512-i]);
					i--;
					left--;
				}
				CallBackOne(iNode->iaddr[10]);
			}

		

			if(left>0){								//二级索引
				short k=512;
				short j=512;

					
				short dir[512];
				short dirChild[512];
				BReadArr(dir,iNode->iaddr[11]);//二级索引1次寻址
				while(left&&k){					//二级索引1次寻址
					BReadArr(dirChild,dir[512-k]);
					while(left&&j){				//二级索引二次回收
					    CallBackOne(dirChild[512-j]);
						left--;
						j--;
					}
				CallBackOne(dir[512-k]);//二级索引一次寻址
				k--;	
				}
				CallBackOne(iNode->iaddr[11]);

			}
			
}

//================================================================
//函数描述:回收文件的iNOde节点
//入口参数:无
//返回值: 无
//===============================================================
void CallBackINode(short diskNum){
	CallBackOne(diskNum);
	
}

//================================================================
//函数描述:删除索引中一项
//入口参数:无
//返回值: -1,不存在,文件号
//===============================================================
void DelDirItem(DirNode *currDir,char fileName[14]){
	for(int i=0;i<64;i++){
		if(strcmp(fileName,currDir->childItem[i].filename)==0){
			//	currDir->DirCount--;
				strcpy(currDir->childItem[i].filename,NullName);
				currDir->childItem[i].i_BNum=-1;
				return;
		}
	}	
	cout<<"删除失败"<<endl;
}
//================================================================
//函数描述:删除一个文件
//入口参数:无
//返回值: 无
//===============================================================

void Del(DirNode *currDir,char fileName[14],INode *iNode){	
	
	  short blockNum=IsFileExist(currDir,fileName);
	  if(blockNum==-1){//不存在该文件,退出
		  cout<<"文件不存在,删除失败"<<endl;
	  }else{				
			if(IsFile(iNode,blockNum)){
						CallBackDisk(iNode);
						DelDirItem(currDir,fileName);
						CleanINode(iNode);
			}else{
				cout<<"文件不存在,删除失败"<<endl;
				}
	} 
		  
		  
}
//================================================================
//函数描述:删除一个目录
//入口参数:无
//返回值: 无
//===============================================================

void Rd(DirNode *currDir,char fileName[14],INode *iNode){	
	
	  short blockNum=IsFileExist(currDir,fileName);
	  if(blockNum==-1){//不存在该文件,退出
		  cout<<"目录不存在,删除失败"<<endl;
	  }else{				
			if(IsDir(iNode,blockNum)){
						CallBackDisk(iNode);
						DelDirItem(currDir,fileName);
						CleanINode(iNode);
			}else{
				cout<<"目录不存在,删除失败"<<endl;
				}
			
	} 
		  
		  
}

//================================================================
//函数描述:显示目录项的内容
//入口参数:无
//返回值: 无
//===============================================================
void Dir(DirNode *currDir,INode *iNode){
	for(int i=0;i<currDir->DirCount;i++){
		if(currDir->childItem[i].i_BNum!=-1){
		BRead(iNode,currDir->childItem[i].i_BNum);			
			ShowFileInfo(iNode,currDir->childItem[i].filename);
		}
		CleanINode(iNode);
	}

}

//================================================================
//函数描述:销毁资源
//入口参数:无
//返回值: 无
//===============================================================
void exit(DirNode *currDir,INode *iNode){
	delete iNode;
	delete currDir;

}
//================================================================
//函数描述:打印版权信息
//入口参数:无
//返回值: 无
//===============================================================
void  AuthorMessage(){

	cout<<"=============================================================================="<<endl;
	
	cout<<"			操作系统课程设计"<<endl;
	
	cout<<"=============================================================================="<<endl;
	
        printf("单位:	济南大学信息学院计本0601班\n");
  	    printf("作者:	范海青\n");
		printf("学号:	20061204013\n");
	    printf("时间:	2009.4	\n");
	    printf("				 版权所有 翻版必究\n");
	   


	cout<<"=============================================================================="<<endl;

}

//================================================================
//函数描述:打印版权信息
//入口参数:无
//返回值: 无
//===============================================================

void help()                       //打印命令及解释
{



	cout<<"==============================================================================\n"<<endl;
	printf("			命令使用指南\n");
	printf("    1:	mf							新建文件\n");
	printf("    2:	md							建立子目录\n");
	printf("    3:	open							打开文件\n");
	printf("    4:	del							删除文件\n");
	printf("    5:	rd							删除目录\n");
	printf("    6:	dir							显示目录\n");
	printf("    7:	exit							退出系统\n");
	printf("    8:	cls							清屏\n");
	cout<<"==============================================================================\n"<<endl;
	cout<<"\n请输入命令,回车确认"<<endl;
}



void main(){

	bool run=true;
	int length=1024;
	char fileName[14];
	char dirName[14];
	int command;
	DirNode *rootNode;		//根节点
	currDir=new DirNode;
	currDir->DirCount=0;
	rootNode=currDir;
	iNode =new INode;

	AuthorMessage();
	Format();				//初始化
	Linkdisk();				//成组连接
	Init();					
	Init(currDir,DIR,"root\\a:\\",iNode,0);

	
	while(run){
		help();
		while(true){
		
		scanf("%d",&command);
		fflush(stdin);   
		if(command>0&&command<9)
		break;
		cout<<"\n命令错误,请重新输入"<<endl;
		command=-1;
		}
		switch(command)
		{	
		case 1:		
			cout<<"\n请输入文件名"<<endl;	//新建问件
			cin>>fileName;
			fflush(stdin);
			cout<<"\n请输入文件长度,单位KB"<<endl;
			cin>>length;
			fflush(stdin);
			if(length<0||length>freeTotalB){
			cout<<"文件长度不合法\n"<<endl;
			break;
			}
			Mf(currDir,fileName,iNode,length);
			break;
		case 2:
			cout<<"\n请输入目录名"<<endl;			
			cin>>dirName;
			Md(currDir,dirName,iNode,1);
			break;
		case 3:
			cout<<"\n请输入打开文件名"<<endl;		//打开文件
			cin>>fileName;
			Open(currDir,fileName,iNode);
			break;
		case 4:
			cout<<"\n请输入删除文件名"<<endl;		//删除文件
			cin>>fileName;	
			Del(currDir,fileName,iNode);
			break;
		case 5:										//建立子目录
			cout<<"\n请输入目录名"<<endl;
			cin>>dirName;
			Rd(currDir,dirName,iNode);
			break;		
		case 6:						
			Dir(currDir,iNode);						//显示当前目录下的信息
			break;
		case 7:			
			exit(currDir,iNode);					//退出系统
			run=false;
			break;
		case 8:
			system("cls");							//清屏		
			break;
		default:
			break;
		}
	}
	
}

⌨️ 快捷键说明

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