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

📄 filesystem_s.cpp

📁 操作系统的文件管理模拟实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "conio.h"
#include<dos.h>

#define NULL 0
#define keynum 10
#define getspace(type) (type*)malloc(sizeof(type))

char cmd[64];  //存放用户输入命令
char buffer[36];//
char user[32];//存放当前登陆的用户名

typedef char ALFA[12];
ALFA KWORD[keynum];

struct UFD{//用户文件管理模块
	char filename[32]; //文件名
	int  safecode;     //文件保护码
	long length;       //文件长度
}*curfile = NULL;

struct MFD{//用户登陆信息管理模块
	char username[32]; //用户名
	bool filepoint;    //用户目录下的文件指针,false表示目录为空,true为该用户目录中有文件
}*curuser = NULL,*elseuser=NULL;
typedef UFD UFD;
typedef MFD MFD;
void main();
//------------------------------------------------------------------------------------------------
void KeyWord()//初始化命令关键字
{
	strcpy(KWORD[ 1],"bye");    strcpy(KWORD[ 2],"chmod");
	strcpy(KWORD[ 3],"close");	strcpy(KWORD[ 4],"create"); 
	strcpy(KWORD[ 5],"delete");	strcpy(KWORD[ 6],"list");   
	strcpy(KWORD[ 7],"open");   strcpy(KWORD[ 8],"read");   
	strcpy(KWORD[ 9],"write");
	
}
//------------------------------------------------------------------------------------------------
int LoginDisplay() //登陆选项操作函数
{
	int SELETE_1 = 0;
	do
	{
    	cout<<"      *****请选择操作*****\n1、用户登陆  2、用户注册  0、退出"<<endl;
    	cin>>SELETE_1;
	}while(SELETE_1<0 || SELETE_1>2);
	system("cls");
	return SELETE_1;
}
//------------------------------------------------------------------------------------------------
bool Login(int SELETE)//用户登陆,注册函数
{
	FILE *fp,*fp1,*fp2;
	char name[12];
	switch(SELETE)
	{
	case 1://用户登陆
		if((fp = fopen("LOGIN.exe","rb")) == NULL)//打开用户注册目录管理文件
		{
			cout<<"\n错误:不能打开登陆文件。"<<endl;
			getch();system("cls");
			return false;
		}
		curuser = getspace(MFD);
		cout<<"\n*****登陆*****\n用户名:";
		cin>>name; //输入用户登陆名
		
		while(!feof(fp)) //检查该用户是否合法
		{
			fread(curuser,sizeof(MFD),1,fp);
			if(strcmp(curuser->username,name)==0)
				break;
		}
		if(feof(fp)) //如果没有找到跟当前登陆用户名相同的管理信息,提示出错
		{
			cout<<"\n错误:该用户不存在。"<<endl;
           	fclose(fp);
	       	return false;
		}
		else
		{
			fclose(fp);
			return true;
		}
		break;
		
	case 2:  //新用户注册
		if((fp=fopen("LOGIN.exe","ab"))==NULL)//如果登陆信息管理文件不存在
			fp=fopen("LOGIN.exe","wb+");      //创建该信息管理文件
		char name[12];
		curuser = getspace(MFD);
		while(1)
		{
			cout<<"\n      *****新用户注册*****"<<endl;
			cout<<"用户名:";
	   		cin>>name;       //输入用户注册名
			fp1 = fopen("LOGIN.exe","rb");
			while(!feof(fp1))//查看该用户名是否被别的用户占用
			{
				fread(curuser,sizeof(MFD),1,fp1);
				if(strcmp(curuser->username,name) == 0)//该名称已经被使用
				{
					cout<<"\n该用户已经存在,请重新输入!"<<endl;
					getch();
					break;
				}
			}
			if(feof(fp1))//该名称没有被别的用户占用
			{
				strcpy(curuser->username,name);
	       		curuser->filepoint = NULL;
	           	fwrite(curuser,sizeof(MFD),1,fp);
				strcpy(user,curuser->username);//生成用户文件管理模块
				strcat(user,".exe");           //用于管理用户目录下的各个文件
				fp2=fopen(user,"wb+");
				fclose(fp2);
       			cout<<"\n注册成功!"<<endl;   //提示注册成功
				fclose(fp1);
	   	    	fclose(fp);
				break;
			}
		}
		fp = fopen("LOGIN.exe","rb"); //显示当前注册用户的名称
		while(1)
		{
			fread(curuser,sizeof(MFD),1,fp);
			if(feof(fp))
				break;
			cout<<curuser->username<<endl;
			getch();
		}
		fclose(fp);
		return true;
		break;
	default:
		return false;
		break;
	}
}
//------------------------------------------------------------------------------------------------
void DisplayUFD()//打印用户信息,包括用户的各个文件
                 //名称、长度和操作权限的设置信息
{
	if(curuser->filepoint == false)//当前用户目录下没有任何文件存在
		cout<<"\n用户 "<<curuser->username<<" 文件夹是空的"<<endl;
	else
	{//存在文件,将所有文件信息打印在终端
		FILE *fp;
		char filename[12];
		strcpy(filename,curuser->username);
		strcat(filename,".exe");
		if((fp=fopen(filename,"rb"))==NULL)//打开用户文件信息管理模块
		{
			cout<<"\n无法打开用户:"<<curuser->username<<" 的文件!"<<endl;
			getch();
			return;
		}
		else
		{//读入并将用户全部文件信息打印在终端
			cout<<"用户:"<<curuser->username<<"目录下的文件:"<<endl;
			UFD *ufd;
			int i=0;
			ufd = getspace(UFD); //申请存放用户文件模块的空间
			while(1)
			{			
				fread(ufd,sizeof(UFD),1,fp);
				if(feof(fp))//全部输出完毕,结束
					break;
				else//打印信息
					cout<<ufd->filename<<"\t"<<ufd->length<<"\t"<<ufd->safecode<<endl;
			}
		}
		fclose(fp);
		
	}
}
//------------------------------------------------------------------------------------------------
void ByeFile(bool BOOL)//注销函数,调用次函数用户可以退出系统
{
	FILE *infile,*outfile;
	char out[50];
	strcpy(out,"outfilelocate.exe");
	if((infile=fopen("LOGIN.exe","rb"))==NULL)
	{
		cout<<"\n保存错误。";	//	fclose(infile);
		return;
	}
	else
	{
		if((outfile=fopen(out,"wb+"))==NULL)//申请一个缓冲区管理模块
			//存放用户更新后的全部信息
		{
			cout<<"\n保存错误。";// fclose(outfile);
			fclose(infile);return;
		}
		else
		{
			MFD *mfd = getspace(MFD);
			while(1)
			{//将旧文件管理信息读出,并保存到新的文件信息管理模块中
				fread(mfd,sizeof(MFD),1,infile);
				if(feof(infile))
					break;
				if((strcmp(mfd->username,curuser->username))==0)
				{
					if(BOOL)//更新当前用户信息的操作
						fwrite(curuser,sizeof(MFD),1,outfile);
					else continue;//如果用户想把自己的注册目录从系统中彻底删除
					//则执行该操作
				}
				else
					fwrite(mfd,sizeof(MFD),1,outfile);//写入新的模块
			}
			fclose(infile);fclose(outfile);
			remove("LOGIN.exe");//将旧的该用户的文件管理模块删除
			rename(out,"LOGIN.exe");//将新的用户的文件管理模块重命名为用户目录下的管理模块	
		}	
	}

}
//------------------------------------------------------------------------------------------------
bool ClearUserFile()//用户要将自己的注册目录从系统彻底删除
//首先将该用户目录下的全部文件删除
{
	FILE *fp;
	char file[50];
	strcpy(file,curuser->username);
	strcat(file,".exe");
	if((fp=fopen(file,"rb"))==NULL) //打开用户文件信息管理模块
	{
	//	fclose(fp);
		cout<<"\n该用户不存在!";return true;
	}
	else
	{//将该用户目录下的文件逐个从磁盘删除
		UFD *ufd = getspace(UFD);
		while(1)
		{
			fread(ufd,sizeof(UFD),1,fp);
			if(feof(fp))
				break;
			else
				remove(ufd->filename);//删除文件
		}
		fclose(fp);
		return true;
	}
}
//------------------------------------------------------------------------------------------------
void ClearUserMes()//删除用户全部信息
{
	char name[50];
	strcpy(name,curuser->username);
	strcat(name,".exe");
	remove(name); //从磁盘中删除用户文件信息管理模块
	ByeFile(false);//更新系统的用户登陆信息管理模块
}
//------------------------------------------------------------------------------------------------
void DeleteUser()//删除用户注册目录的操作
{
	char ch;
	cout<<"\n该操作将会是你在系统所有信息删除,下次登陆时你必须重新申请用户名!"<<endl;
	cout<<"\n你确定要删除你在系统中的注册信息吗?Y/N"<<endl;
	cin>>ch;
	switch(ch)//提示用户确认删除
	{
	case 'Y':
	case 'y':
		if(ClearUserFile())//如果用户的全部文件已经删除了
			//则可以将该用户的文件信息管理模块也从磁盘中删除
			//以免在没完全删除文件却删了该文件信息管理模块
			//使得这些文件无法再进行管理造成磁盘空间的浪费
			ClearUserMes();//删除文件信息管理模块
		break;
	default:
		cout<<"\n你取消了此操作!";
		break;
	}
}
//------------------------------------------------------------------------------------------------
void CreatFile()//在当前用户目录下创建文件
{
	FILE *fp;
   	curuser->filepoint=true;

	if((fp=fopen(buffer,"r"))==NULL)//如果没有跟用户输入文件名相同的文件
	{
    	if((fp=fopen(buffer,"w"))==NULL)
		{
    		cout<<"\n创建文件失败!";
		//	fclose(fp);
    		return;
		}
		fclose(fp);
	}
	else
	{//用户要创建的文件已经存在
		cout<<"\n该文件已经存在,创建另一个文件?Y/N";
		char ch;
		cin>>ch;
		switch(ch)
		{
		case 'Y':
		case 'y':
			cout<<"\n输入新文件名:";
			cin>>buffer;
			strcat(buffer,".txt");
			fclose(fp);
        	if((fp=fopen(buffer,"w"))==NULL)
			{
        		cout<<"\n创建文件失败!";
			//	fclose(fp);
            	return;
			}
        	fclose(fp);
			break;
		default:
			fclose(fp);
			return;
		}
	}
	strcpy(user,curuser->username);
	strcat(user,".exe");
	curfile = getspace(UFD);
	strcpy(curfile->filename,buffer);//文件名
	curfile->length=0; //该文件长度为零
	curfile->safecode=30; //设置该文件的默认权限
	    //11 00,文件主有读和写权,其他用户没有读写权
	if((fp=fopen(user,"ab"))==NULL)
	{
		cout<<"\n错误:你可能不是合法用户。"<<endl;
		getch();
	}
	else
	{
		fwrite(curfile,sizeof(UFD),1,fp);//将该文件信息写入用户文件信息管理模块中
		cout<<"\n文件 "<<curfile->filename<<" 创建成功!";
	}
	fclose(fp);
}
//------------------------------------------------------------------------------------------------
void DeleteFile()//删除当前目录下一个文件的操作
{
	char ch;
	FILE *infile,*outfile;
	cout<<"\n确定要删除文件:"<<buffer<<" Y/N"<<endl;
	cin>>ch;//提示用户确认删除
	switch(ch)
	{
	case 'Y':
	case 'y'://更新用户文件信息管理模块,这里同样使用缓冲区模块来更新
		    //方法与上面将到的类似
			char out[50],in[50];
         	strcpy(out,"outfilelocate.exe");
			strcpy(in,curuser->username);
			strcat(in,".exe");
        	if((infile=fopen(in,"rb"))==NULL)//打开该用户的文件信息管理模块
			{
	        	cout<<"\n保存错误。";
	        	//fclose(infile);
				return;
			}
        	else
			{
	        	if((outfile=fopen(out,"wb+"))==NULL)
				{
	        		cout<<"\n保存错误。";// fclose(outfile);
	        		fclose(infile);return;
				}
	        	else
				{
	        		UFD *ufd = getspace(UFD);
		        	while(1)
					{
		        		fread(ufd,sizeof(UFD),1,infile);//从旧模块读出信息
		        		if(feof(infile))
			        		break;
			        	if((strcmp(ufd->filename,buffer))==0)//要进行更新的信息
							continue;
			        	else
				        	fwrite(ufd,sizeof(UFD),1,outfile);//写入新模块
					}
		        	fclose(infile);fclose(outfile);
		        	remove(in);//在磁盘移除就模块
		        	rename(out,in);	//新模块命名为当前用户文件信息管理模块
				}	
			}
		remove(buffer);//从磁盘中删除该文件
		break;
	default:
		break;
	}
}
//------------------------------------------------------------------------------------------------
void ListAllFile()//显示当前用户目录下的文件信息
{
	DisplayUFD();
}
void WriteLengthToFile(int Len,bool BOOL);
//------------------------------------------------------------------------------------------------
void OpenFile()//在window模式下打开该文件
{
	FILE *fp;
	char ch;
	int i=0;
	system(buffer);//buffer为文件名,如:file1.txt
	fp=fopen(buffer,"r");	
	while(1){//获取新文件的长度
		if(feof(fp))
			break;
		ch=fgetc(fp);
		i++;
	}
	WriteLengthToFile(i,false);//将修改后的文件长度写入管理表
}
//------------------------------------------------------------------------------------------------
bool QueryModElse(bool BOOL,bool &flag)//查询其它用户目录下文件的文件
//当该文件的权限允许当前用户对其执行有关操作时,返回ture
{
	FILE *fp;
	char user[50];
	UFD *ufd = getspace(UFD);//elseuser表示除当前用户外的所有用户注册目录
	strcpy(user,elseuser->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);return false;
			}
			if(strcmp(ufd->filename,buffer)==0){
				if(BOOL)//该用户请求写该文件
				{
					if(ufd->safecode== 31 || ufd->safecode== 33)
						//1101、1111最后一位为1,有写权
						return true;
					else{
						cout<<"\n你无权对文件 "<<buffer<<" 执行此操作!";
						flag=true;return false;}
					//flag设置为true,告诉上一层,无须再查找
					//该文件已经找到,但用户无权执行相关操作
				}
				else //该用户请求读权
				{
					if(ufd->safecode == 32 || ufd->safecode == 33)
						//1110、1111倒数第二位为1,有读权

⌨️ 快捷键说明

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