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

📄 filesystem_s.cpp

📁 操作系统的文件管理模拟实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						return true;
					else{
						cout<<"\n你无权对文件 "<<buffer<<" 执行此操作!";
						flag=true;return false;}  
				}
			}
		}
	}
}
//------------------------------------------------------------------------------------------------
bool QueryMod(bool BOOL)//查询权限
{//首先在用户目录下查找,如果找不到用户当前要进行操作的文件名
	//则在其它注册用户目录下查找
	FILE *fp,*fp1;
	bool flag=false;
	char user[50];
	UFD *ufd = getspace(UFD);
	strcpy(user,curuser->username);
	strcat(user,".exe");

	if((fp=fopen(user,"rb"))==NULL){//打开用户文件信息管理模块
	//	fclose(fp);
		cout<<"\n操作出现错误,对此我们表示歉意!";return false;
	}
	else{//查找匹配的文件名,用户目录下的文件允许用户进行读写操作
		while(1){
			fread(ufd,sizeof(UFD),1,fp);
			if(feof(fp)){//在当前用户文件管理模块中找不到匹配文件
				//则继续在其它用户注册目录下查找
				fclose(fp);
				fp1=fopen("LOGIN.exe","rb");
				elseuser = getspace(MFD);
				bool BOOL_1=false;
				while(1){					
					fread(elseuser,sizeof(MFD),1,fp1);//读其它用户信息
					if(feof(fp1) && !BOOL_1)//全部用户都查找完
						//但仍然没找到匹配的文件
						return false;
					if(elseuser != curuser){
					   if((BOOL_1==QueryModElse(BOOL,flag)))//查找
						   return true;
					   if(flag)
						   return false;
					}
				}
			}
			if(strcmp(ufd->filename,buffer)==0){//在当前用户注册目录下
				//找到该文件,返回真值
				fclose(fp);return true;
			}
		}
	}
}
//------------------------------------------------------------------------------------------------
bool WriteRight(int len,bool BOOL)//查看是否已经正确地写入到该文件信息中
//是则返回真值
{
	
	char user[50],outfile[50];
	FILE *fp,*fp1;
	strcpy(user,elseuser->username);
	strcat(user,".exe");
	if((fp=fopen(user,"rb"))==NULL){
	//	fclose(fp);
		return false;
	}
	else{
		UFD *ufd = getspace(UFD);
		while(1){//在此用户目录下查找匹配文件
			fread(ufd,sizeof(UFD),1,fp);
			if(feof(fp)){
				fclose(fp);return false;
			}
			if((strcmp(ufd->filename,buffer))==0){//找到要写入新的长度的文件
				
				strcpy(outfile,"outfilelocate.exe");
				if((fp1=fopen(outfile,"wb+"))==NULL){
					cout<<"\n错误:写入文件长度出错_3。";
				//	fclose(fp1);
					fclose(fp);return false;
				}
				else{
					fclose(fp);
					fp=fopen(user,"rb");//文件指针从新指向此用户文件信息管理模块开头
					while(1){
						fread(ufd,sizeof(UFD),1,fp);
						if(feof(fp))
							break;
						if(strcmp(ufd->filename,buffer)==0){//找到匹配的文件
							if(BOOL) ufd->length+=len; //在文件末追加内容的操作
							else ufd->length =len;     //覆盖原文件内容
						}
						fwrite(ufd,sizeof(UFD),1,fp1);
					}
					fclose(fp);fclose(fp1);
					remove(user);
					rename(outfile,user);
					return true;
				}
			}
		}
	}
}
//------------------------------------------------------------------------------------------------
void WriteLengthToFile(int Len,bool BOOL)//将文件长度写入文件管理模块中
{//因为当前用户可以对其它用户的文件进行操作(只要权限允许)
	//所以应该在整个文件系统目录下查找该文件的位置
	FILE *fp;
	if((fp=fopen("LOGIN.exe","rb"))==NULL){//不能打开文件
		cout<<"\n写入文件长度错误_1!";
	//	fclose(fp);
		return;
	}
	else{
		elseuser = getspace(MFD);
		while(1){
			fread(elseuser,sizeof(MFD),1,fp);
			if(feof(fp))
				break;
			else{
				if(WriteRight(Len,BOOL)){//查看是否已经正确地写入到该文件信息中
					fclose(fp);return;
				}
			}
		}
		cout<<"\n写入文件长度错误_2!";
		fclose(fp);return;
	}
}
//------------------------------------------------------------------------------------------------
void WriteFile()//向文件写入信息的操作
{
	if(!QueryMod(true))//查询当前用户对该文件是否有写权
		return;//对该文件没有写权则返回
	char ch;
	int i=0;
	FILE *fp;
	if((fp=fopen(buffer,"r"))==NULL)//查询该文件是否存在
	{
		cout<<"\n该文件不存在,请创建该文件后再写入。";
	//	fclose(fp);
		return;
	}
	fclose(fp);
	cout<<"\n请选择写入方式:"<<endl;
	cout<<"  1、覆盖原文件    2、在原文件末尾写入   3、取消"<<endl;
	cin>>ch;
	cout<<"开始输入正文:"<<endl;
	switch(ch)
	{
	case '1'://覆盖原文件
		if((fp=fopen(buffer,"w"))==NULL)
			cout<<"\n文件打开失败。";
		else
		{
			ch=getchar();
			while(ch!='#')//将新的文件内容写入到文件的磁盘位置中
			{
				i++;
				fputc(ch,fp);
				ch=getchar();
			}
		}
		fclose(fp);
		WriteLengthToFile(i,false);//将文件长度写入文件管理模块
		break;
	case '2':
		if((fp=fopen(buffer,"a"))==NULL)
			cout<<"\n文件打开失败。";
		else
		{
			ch=getchar();
			while(ch!='#')//将新的文件内容写入到文件的磁盘位置中
			{
				i++;
				fputc(ch,fp);
				ch=getchar();
			}
		}
		fclose(fp);
		WriteLengthToFile(i,true);//将文件长度写入文件管理模块
		break;
	default:
		break;
	}
}
//------------------------------------------------------------------------------------------------
void ReadFile()//读文件函数
{
	if(!QueryMod(false))//查询当前用户是否有权读该文件
		return;//没有读权,则返回
	FILE *fp;
	if((fp=fopen(buffer,"r"))==NULL)//打开该文件
	{
		cout<<buffer;
		cout<<"\n该文件不存在。";
		return;
	}
	else{
		char ch;
		ch=fgetc(fp);
		while(ch!=EOF)//将该文件信息逐一输出到终端
		{
			putchar(ch);
			ch=fgetc(fp);
		}
		cout<<endl;
	}	
	fclose(fp);
}
//------------------------------------------------------------------------------------------------
void ChangeMod()//修改某文件的执行权限
{
	int mod=40;	
	FILE *fp,*infile,*outfile;

	char in[50],out[50];
	UFD *ufd = getspace(UFD);
	strcpy(in,curuser->username);
	strcat(in,".exe");
	strcpy(out,"outfilelocate.exe");

	if((fp=fopen(in,"rb"))==NULL){
	//	fclose(fp);
		cout<<"\n操作出现错误,对此我们表示歉意!";return;
	}
	else{
		while(1){//查看该文件是否在当前用户的注册目录下
			//任何用户无权修改不是自己目录下的文件的权限值
			fread(ufd,sizeof(UFD),1,fp);
			if(feof(fp)){//在当前目录下找不到该文件,说明该用户无权修改该文件权限
				cout<<"\n你没有权限对文件 "<<buffer<<" 执行该操作!";
				fclose(fp);return;
			}
			if(strcmp(ufd->filename,buffer)==0){//找到该文件,继续操作
				fclose(fp);break;
			}
		}
	}
	bool flag1=true;
	while(flag1)
	{
    	cout<<"\n输入文件  "<<buffer<<" 的新的权限值:";
    	cin>>mod;//输入权限值
		if(mod<30 || mod>33)
		{//确保输入的权限值正确
			cout<<"\n错误:权限值必须在30~33之间";
			continue;
		}
		else{
			char ch;
			switch(mod){//告诉用户对该文件权限修改的结果,以便用户确认
			case 30:
				cout<<"\n当前权限设置:其他用户对"<<buffer<<"既没读权也没写权!";
				break;
			case 31:
				cout<<"\n当前权限设置:其他用户对"<<buffer<<"没读权但有写权!";
				break;
			case 32:
				cout<<"\n当前权限设置:其他用户对"<<buffer<<"有读权但没写权!";
				break;
			case 33:
				cout<<"\n当前权限设置:其他用户对"<<buffer<<"既有读权也有写权!";
				break;
			default: break;
			}
			cout<<"\n确认按'Y',取消按'N':";
			cin>>ch;
			switch(ch){
			case 'Y':
			case 'y':flag1=false;break;
			default: flag1=true;
			}
		}
	}
	//更新文件信息管理模块,相关操作类似上面,不在赘述
	if((infile=fopen(in,"rb"))==NULL){
		cout<<"\n操作出现错误,对此我们表示歉意!";fclose(infile);
		return;
	}
	else{
		if((outfile=fopen(out,"wb+"))==NULL){
	    	cout<<"\n操作出现错误,对此我们表示歉意!";
			fclose(infile);//fclose(outfile);
	    	return;
		}
		else{
			while(1)
			{
				fread(ufd,sizeof(UFD),1,infile);
        		if(feof(infile))
	        		break;
		       	if((strcmp(ufd->filename,buffer))==0)
					ufd->safecode=mod;
	        	fwrite(ufd,sizeof(UFD),1,outfile);
			}
		    fclose(infile);fclose(outfile);
		   	remove(in);
		   	rename(out,in);	
		}
	}
}
//------------------------------------------------------------------------------------------------
void Execute(int i,int len,int cmdset)//执行命令函数
{
	int j=0;
	for(;i<len;i++)
	{		
		if(cmd[i]=='>'||cmd[i]==' '){
		//	buffer[i] = '\0';
			break;
		}
	/*	if(i==len-1)
		{
			buffer[j]=cmd[i];
			buffer[j+1]='\0';
			break;
		}*/
		buffer[j]=cmd[i];j++;
	}
	buffer[j]='\0';
	strcat(buffer,".txt");
	switch(cmdset)
	{
	case 1: //退出
		ByeFile(true);
               system("cls");

		break;
	case 2: //改变文件操作权限
		if((strcmp(buffer,".txt"))==0){
			cout<<"\n输入命令出错!";
			return;
		}
		ChangeMod();
		break;
	case 3: //删除用户
        DeleteUser();
		break;
	case 4: //创建文件
		if((strcmp(buffer,".txt"))==0){
			cout<<"\n输入命令出错!";
			return;
		}
		CreatFile();
		break;
	case 5: //删除文件
		if((strcmp(buffer,".txt"))==0){
			cout<<"\n输入命令出错!";
			return;
		}
		DeleteFile();
		break;
	case 6: //列出该用户所有文件清单
		ListAllFile();
		break;
	case 7: //打开文件
		if((strcmp(buffer,".txt"))==0){
			cout<<"\n输入命令出错!";
			return;
		}
		OpenFile();
		break;
	case 8: //读文件
		if((strcmp(buffer,".txt"))==0){
			cout<<"\n输入命令出错!";
			return;
		}
		ReadFile();
		break;
	case 9: //写文件
		if((strcmp(buffer,".txt"))==0){
			cout<<"\n输入命令出错!";
			return;
		}
		WriteFile();
		break;
	default:
		break;
	}
}
//------------------------------------------------------------------------------------------------
void Command()//读取用户输入的命令,并将其转换成系统能识别的命令
{
	int len = 0,i,j;
	int cmdset;
	while(1)
	{
		cmdset = 0;
		cout<<"\nrun\\";
		cin>>cmd;
		len = strlen(cmd);
		i=0;j=0;
		while(cmd[i]=='>'||cmd[i]==' '){i++;}//过滤空格键和'>'
		for(;i<len;i++)
		{
			
			if(cmd[i]=='>' || cmd[i]==' ' || i==len-1)
			{
				if(cmd[i]=='>' || cmd[i]==' ')
					buffer[j] = '\0';
				else
					if(i==len-1)
					{
		    			buffer[j]=cmd[i];
		    			buffer[j+1]='\0';
					}
				i++;
				j=0;
				int low=1,mid,high=keynum-1;
				bool BOOL = false;
        	    while(low<=high){//找到该命令关键字的内部识别码
					mid=(low+high)/2;
					if (strcmp(buffer,KWORD[mid])<=0) high=mid-1;
				   	if (strcmp(buffer,KWORD[mid])>=0) low=mid+1;		
					if(strcmp(buffer,KWORD[mid])==0){ 
				       		BOOL = true;
				       		break;
					}
				}
				if(!BOOL)
				{
					cout<<"\n"<<buffer<<"不是系统定义的命令...";
					cmdset = 0; break;
				}
				else {cmdset = mid;break;}
			}
			else{
				buffer[j] = cmd[i];
		    	j++;
			}
		}
		if(cmdset == 0) continue;
		while(cmd[i]=='>'||cmd[i]==' '){i++;}//过滤空格键和'>'
		buffer[0]='\0';
		Execute(i,len,cmdset);  //执行该命令
	}
}
//------------------------------------------------------------------------------------------------
void main()
{
	while(1){
    	int SELETE = LoginDisplay();
		if(SELETE==0)
			exit(0);
    	bool BOOL = Login(SELETE);//用户登陆,或者注册函数
    	if(BOOL)
		{
	    	KeyWord();  //初始化命令关键字
	    	DisplayUFD();//打印用户目录下的文件
	        Command();   //命令行操作
		}
	}
}

⌨️ 快捷键说明

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