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

📄 虚拟文件系统.cpp

📁 这个程序是模拟采用二级目录结构的磁盘文件系统中的文件操作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	ifstream input_file;
	ofstream output_file;
	int i=0,id1=-1,j=0,id2=-1;
	//在ufdlist中查找filename1
	for(;i<16;i++){
		if(strcmp(ufdlist[i].filename,filename1)==0)
		{
			id1=i;
		}
	}
	if(id1==-1){//在ufdlist没有找到filename1
		cout<<"所需复制的源文件不存在,不能复制!\n";
		return;
	}
	else
	{
		//原文件存在,查找目标文件是否在盘快中
		id2=-1;
		for(i=0;i<16;i++){
		if(strcmp(ufdlist[i].filename,filename2)==0)
		{
			id2=i;
			break;
		}
		}
		if(id2!=-1)
		{
			char zh;
			cout<<"目标文件已经存在,是否覆盖?y/n \n";
			cin>>zh;
			if(zh=='n')return;
			ufdlist[id2].mode =ufdlist[id1].mode ;
			ufdlist[id2].length =0 ;
		}
		
		if(id2==-1)
			//在ufdlist没有找到filename2
		{//cout<<"请先创建"<<filename2<<"文件!\n";return;
		create(filename2,ufdlist[id1].mode);
		close(filename2);
		for(i=0;i<16;i++)
		{
			if(strcmp(ufdlist[i].filename,filename2)==0)
			{
				id2=i;
			}

		}
		}
		//else{
			input_file.open("disk.txt",ios::binary|ios::ate);
			output_file.open("disk.txt",ios::binary|ios::ate);
			input_file.seekg(ufdlist[id1].addr*513,ios::beg);
			output_file.seekp(ufdlist[id2].addr*513,ios::beg);
			char a;
			int address1=ufdlist[id1].addr;
			int address2=ufdlist[id2].addr;
			input_file.get(a);
			while(a!='\0')
			{
				if(a!='\n')
				{
				
				output_file.put(a);
				
				
				}
				else{
				
					address1=disklist[address1].next;
					if(disklist[address2].next==0)
					{
						disklist[address2].next=getdisk();
						//	ufdlist[id2].length++;
					}
					address2=disklist[address2].next;				
					input_file.seekg(address1*513,ios::beg);
				
					output_file.seekp(address2*513,ios::beg);
				}
				input_file.get(a);
			}
		}
	
	output_file.put('\0');
	ufdlist[id2].length=ufdlist[id1].length ;
	cout<<"拷贝文件"<<filename1<<"->"<<filename2<<"成功!\n";
		back_disklist();
	back_mfd();
	back_ufd();
//	close(filename2);
	input_file.close();
	output_file.close();
}	



//显示文件内容
void type(char filename[])
{
	int i=0,id1=-1,block;
	char ch;
	ifstream input_file;
	for(;i<16;i++){
		if(strcmp(ufdlist[i].filename,filename)==0)
		{
			id1=i;
		}
	}
	if(id1==-1){//在ufdlist找到
		cout<<"该文件不存在,不能显示文件!\n";
		return;
	}
	else
	{
		input_file.open("disk.txt",ios::binary|ios::ate);
		if(!input_file)
		{
			cout<<"file open error!\n";
			return;
		}
		block=ufdlist[id1].addr;
	//	cout<<"block"<<block<<endl;
		input_file.seekg(block*513,ios::beg);
		input_file.get(ch);
		while(ch!='\0')
		{
			cout<<ch;
			input_file.get(ch);
			if(ch=='\n')
			{
				block=disklist[block].next;
				input_file.seekg(block*513+1,ios::beg);
				input_file.get(ch);
			}
		}
		cout<<'\n';
	}

}

//改变密码	
void passwd(char pass1[],char pass2[]){
	int i=0,id1=-1;
	//在mfdlist中查找
	for(;i<16;i++){
		if(strcmp(mfdlist[i].username,cur_user)==0)
		{
			id1=i;
		}
	}
	if(strcmp(mfdlist[id1].password,pass1)!=0)
	{
		cout<<"您输入的旧密码错误,无法改变密码!\n";
		return;
	}
	else
	{
		strcpy(mfdlist[id1].password,pass2);
		cout<<"修改密码成功!请记住您的新密码!\n";
			back_disklist();
	back_mfd();
	back_ufd();
		return;
	}

}


//删除文件
void delet(char filename[])
{
	int i=0,id1=-1,j=0,id2=-1,block;
	//在ufdlist中查找
	for(;i<16;i++){
		if(strcmp(ufdlist[i].filename,filename)==0)
		{
			id1=i;
		}
	}
	if(id1==-1){//在ufdlist没有找到
		cout<<"该文件不存在,不能删除!\n";
		return;
	}
	else
	{//在uoflist中查找
		for(;j<16;j++)
		{
			if(strcmp(uoflist[j].filename,filename)==0)
			{
				id2=j;
			}
		}
		if(id2!=-1)
		{//清除uoflist中的表项
			strcpy(uoflist[id2].filename,"");
		}
		//归还文件的存贮区域
		block=ufdlist[id1].addr;
		while(disklist[block].next!=0)
		{
			disklist[block].flag='0';
			block=disklist[block].next;
		}
		disklist[block].flag='0';

		//ufdlist中清除该项
		strcpy(ufdlist[id1].filename,"");

		cout<<"删除文件成功!\n";
			back_disklist();
	back_mfd();
	back_ufd();
		return;

	}

}


//打开文件
void open(char filename[],int mod){
	int i=0,id1=-1,j=0,id2=-1;
	for(;i<16;i++){
	if(strcmp(ufdlist[i].filename,filename)==0)
	{
		id1=i;
	}
	}
	if(id1==-1){
		cout<<"该文件不存在,不能打开!\n";
		return;
	}
	else{
		//在uoflist中查找
		for(;j<16;j++){
		if(strcmp(uoflist[j].filename,filename)==0)
		{
			id2=j;
		}
		}
		if(id2!=-1)//在uoflist中找到
		{
			if(uoflist[id2].state==0)
				cout<<"文件正在建立不能打开!\n";
			else
				cout<<"文件已经打开!\n";
				return;
		}
		else//没有在uoflist中找到
		{
			if(ufdlist[id1].mode!=mod)
			{
				cout<<"文件属性不合法!不能打开文件!\n";
					return;
			}
			else
			{//一下找到uoflist中的一个空表项登记该文件信息
				for(i=0;i<16;i++)
				{
					if(strcmp(uoflist[i].filename,"")==0)
						break;
				}
				strcpy(uoflist[i].filename,ufdlist[id1].filename);
				uoflist[i].state=1;
				uoflist[i].length=ufdlist[id1].length;
				uoflist[i].mode=ufdlist[id1].mode;
				uoflist[i].addr=ufdlist[id1].addr;
				uoflist[i].readptr=0;
				cout<<"打开文件成功!\n";
				ifstream input_file;
				input_file.open("disk.txt",ios::binary|ios::ate);
				input_file.seekg (ufdlist[id1].addr*513,ios::beg);
			    int address1=ufdlist[id1].addr;//文件开始盘块号;
				char c;
				input_file.get(c);
				int x=0;
				while(c!='\0')//查找文件末尾,写指针定义为相对最后的盘块的偏移量;
				{
					
	                
					if(c!='\n')
					{
						x++;					
					}
					else 
					{
						input_file.seekg (address1*513,ios::beg);
                        x=0;
						if(disklist[address1].next !=0)
							address1=disklist[address1].next ;

					}
					input_file.get(c);

				}
                uoflist[i].writeptr=x;
				return;

			}

		}

	}
	
}


//将buffer中的nbytes写入到写指针指定的位置。
void write(char filename[],char buffer[],int nbyte)
{
	ofstream outfile;
	for(int i=0;i<16;i++)
	{
	    if(strcmp(uoflist[i].filename,filename)==0)
		break;
	}
	if(i==16)
	{
		cout<<"该文件没有打开!\n";
		return;
	}
	if(uoflist[i].mode==0)
	{
		cout<<"文件只读!\n";
		return;
	}
	outfile.open("disk.txt",ios::binary|ios::ate);
	if(!outfile)
	{
		cout<<"open file disk.txt error!\n";
		return;
	}
	int address;//记录文件最后的盘块号;
	address=uoflist[i].addr;
	while(disklist[address].next!=0)
		address=disklist[address].next;
		
	outfile.seekp(address*513+uoflist[i].writeptr,ios::beg);   
    long cur_pos;
	for(int j=0;j<nbyte;j++)
	{
		cur_pos=outfile.tellp();
 
		if((cur_pos+1)%513!=0)
		{
		outfile.put(buffer[j]);	
		uoflist[i].length ++;
		}
		else
		{
			disklist[address].next=getdisk();
		//	uoflist[i].writeptr=0;
			
			outfile.seekp(disklist[address].next*513,ios::beg);
			
		
			j--;

		}
			for(int k=0;k<16;k++)
				if(strcmp(ufdlist[k].filename ,filename)==0)
					break;
			ufdlist[k].length =uoflist[i].length;
	}

	outfile.put('\0');

	uoflist[i].writeptr=(uoflist[i].writeptr+nbyte)%513;
	cout<<"当前文件读指针位置为"<<uoflist[i].writeptr<<endl;
	cout<<"成功写入文件!\n";
		back_disklist();
	back_mfd();
	back_ufd();
	outfile.close();
	return;


	
}

//将文件当前读指针开始的nbytes 读入buffer 字符串数组中
void read(char filename[],char buffer[], int nbyte)
{
	int i=0,id=-1,block,offset;
	ifstream infile;
	for(;i<16;i++)
	{
		if(strcmp(uoflist[i].filename,filename)==0)
		{
			id=i;
		}
	}
	if(uoflist[i].mode==1)
	{
		cout<<"文件只读!\n";
		return;
	}
	if(id==-1){
	cout<<"该文件还没有打开,不能读出!\n";
	return;
	}
	block=uoflist[id].addr;
	offset=uoflist[id].readptr;
	infile.open("disk.txt",ios::binary|ios::ate);
	if(!infile)
	{
		cout<<"open file disk.txt error!\n";
		return;
	}
	infile.seekg(block*513+offset,ios::beg);
	long cur_addr=0;
	int index=0;
	for(i=0;i<nbyte;i++)
	{
		if((cur_addr+1)%513!=0)
		{
		infile.get(buffer[i]);
		if(buffer[i]=='\0')
			break;
		}
		else
		{
			block=disklist[block].next ;
			if(block==0)			
				break;
			index=disklist[block].next-block;
			infile.seekg(block*513,ios::beg);
			i--;
		}
	}
	buffer[i]='\0';	
		uoflist[id].readptr=index*513+i+uoflist[id].readptr;
	cout<<"成功读取文件内容如下:"<<buffer<<endl;
	infile.close();

}

//列出该用户下所有文件, 输出格式:文件名 mode length startAdd 
void dir()
{
	int i=0,total=0,k=0;
	cout<<cur_user<<"的文件目录:\n";
	for(;i<16;i++){
		if(strcmp(ufdlist[i].filename,"")!=0)
		{
		total++;	
		k=strlen(ufdlist[i].filename);
		k=14-k;
		//cout<<'\t';
		while(k>0)
		{
			cout<<' ';
			k--;
		}
		cout<<ufdlist[i].filename<<"   ";
		switch(ufdlist[i].mode)
		{
		case 0:
			cout<<"--r--";
			break;
		case 1:
			cout<<"--w--";
			break;
		case 2:
			cout<<"-r-w-";
			break;
		default:
			cout<<"error";
			break;
		}
		
		cout<<"\t"<<ufdlist[i].length<<"Byte(s)"<<"\t"<<ufdlist[i].addr<<endl;
		}
	}
	cout<<"\t\t\t共有文件"<<total<<"个\n";
}


//用户登出
void logout()
{
	back_disklist();
	back_mfd();
	back_ufd();
	for(int i=0;i<16;i++)
	{
		strcpy(uoflist[i].filename,"");
		strcpy(ufdlist[i].filename ,"");
		ufdlist[i].addr =0;
		ufdlist[i].length =0;
		ufdlist[i].mode  =0;

	}
	cout<<cur_user<<"您已经退出系统!\n";
    return;
}

//系统帮助,显示系统命令
void help()
{
	cout<<"              系统命令用法如下:\n";
	cout<<"\tchmod\tfilename\tmode\t改变文件权限\n";
	cout<<"\t\t(mode:   0-read_only; 1-write_only; 2-read_write)\n";
	cout<<"\tchown\tfilename\tnew_owner\t改变文件拥有者\n";
	cout<<"\tmy\tsrcFile\t\tdesFile\t改变文件名\n";	
	cout<<"\tcopy\tsrcFile\t\tdesFile\t文件拷贝\n";
	cout<<"\ttype\tfilename\t\t显示文件内容\n";
	cout<<"\tpasswd\toldPwd\t\tnewPwd\t修改用户口令\n";	
	cout<<"\tlogin\tuserName\tpwd\t用户登陆\n";
	cout<<"\tlogout	\t \t \t  用户登出\n";
	cout<<"\tcreate\tfilename\tmode\t建立文件\n";
    cout<<"\t\t(mode:   0-read_only; 1-write_only; 2-read_write)\n";
	cout<<"\tdelet\tfilename\t \t删除文件\n";
	cout<<"\topen\tfilename\tmode\t打开文件\n";
	cout<<"\t\t(mode:   0-read_only; 1-write_only; 2-read_write)\n";
	cout<<"\tclose\tfilename\t\t关闭文件\n";
	cout<<"\twrite\tfilename buffer nbytes 将buffer中的nbytes写入文件\n";
	cout<<"\t\t(输入的字符之间不能有空格!)\n";
	cout<<"\tread\tfilename  nbyte 将文件读指针开始的nbyte读入buffer字符串中\n";  
	cout<<"\thelp\t\t\t  \t显示本系统命令\n";
	cout<<"\tdir \t 列出该用户下所有文件\n\t\t(输出格式:文件名 mode length startAdd)\n";
}


//运行系统
void run()
{
	int mod,nbyte,ext=1;
	while(1){
	cout<<cur_user<<">";
	cin>>command;
	if(strcmp(command,"chmod")==0){
		
		cin>>parameter1>>mod;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\nlogin 用户名 密码\n";
			continue;
		}
		chmod(parameter1,mod);
	}
	else if(strcmp(command,"chown")==0){
		cin>>parameter1>>parameter2;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\nlogin 用户名 密码\n";
			continue;
		}
		chown(parameter1,parameter2);
	}
	else if(strcmp(command,"my")==0){
		cin>>parameter1>>parameter2;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		my(parameter1,parameter2);
	}
	else if(strcmp(command,"copy")==0){
		cin>>parameter1>>parameter2;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		copy(parameter1,parameter2);
	}
	else if(strcmp(command,"type")==0){
		cin>>parameter1;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		type(parameter1);
	}
	else if(strcmp(command,"passwd")==0){
		cin>>parameter1>>parameter2;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		passwd(parameter1,parameter2);
	}
	else if(strcmp(command,"create")==0){
		cin>>parameter1>>mod;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		create(parameter1,mod);
	}
	else if(strcmp(command,"delet")==0){
		cin>>parameter1;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		delet(parameter1);
	}
	else if(strcmp(command,"open")==0){

		cin>>parameter1>>mod;
			if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		open(parameter1,mod);
	}
	else if(strcmp(command,"close")==0){
		cin>>parameter1;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		close(parameter1);
	}
	else if(strcmp(command,"dir")==0){
			if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		dir();
	}
	else if(strcmp(command,"read")==0){
		cin>>parameter1>>nbyte;
	if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		read(parameter1,parameter2,nbyte);
	}
	else if(strcmp(command,"write")==0){
		cin>>parameter1>>parameter2>>nbyte;
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		write(parameter1,parameter2,nbyte);
	}
	else if(strcmp(command,"logout")==0){
		if(strcmp(cur_user,"")==0)
		{
			cout<<"请先登陆!\n login 用户名 密码\n";
			continue;
		}
		logout();
		ext--;
		strcpy(cur_user,"");
		cout<<"如果还有其他用户登陆,请输入login 用户名 密码\n";

		cout<<"想退出输入 exit \n";
	}
	else if(strcmp(command,"help")==0){
		help();
	}
	else if(strcmp(command,"login")==0){
		if(ext==1)
		{cout<<"请先注销当前用户"<<cur_user<<"!\n";}
		else{
		cin>>parameter1>>parameter2;
		login(parameter1,parameter2);
		ext++;
		}
	}
	else if(strcmp(command,"exit")==0){
		exit(0);
	}
	else
	{cout<<command<<"不是本系统的命令!\n";
	continue;
	}
			
	}
}



void main()
{
	char f;
	cout<<"          =================================================\n";
    cout<<"                    欢迎进入二级目录的文件系统!!!\n";
	cout<<"          =================================================\n";

	
	cout<<"系统格式化按f,否则按其它:"<<endl;
   cin>>f;
   if(f=='f')  {
	   format();
   }
	else{
	initial_mfd();//主文件目录初始化
	}
	initial_disk();//初始化disklist表
	cout<<"您必须首先使用login 用户名  密码 命令登录才能正常使用\n>";
log:	cin>>command;
	
	if(strcmp(command,"login")==0)
	{
		cin>>parameter1>>parameter2;
		login(parameter1,parameter2);//用户登录
	}
	else
	{
		cout<<"请使用login命令登陆!\n>";
		goto log;
	}
	
	run();//运行系统
}

⌨️ 快捷键说明

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