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

📄 shiyan_4.cpp

📁 程序主要模拟了系统文件管理的功能
💻 CPP
字号:
#include<iostream>
using namespace std;
#include<time.h>
struct wenjian
{
	char name[50];//目录名称
	int number;//目录中文件个数
	int num;//目录中子目录个数
	struct tm tnow;//目录创建时间
	union
	{
		int size;//文件大小
    	int locate;//文件在位示图中的起始位置
		int weishitu[10][10];//位示图
	};
	struct wenjian *wen[100];//横向—本目录文件
	struct wenjian *list[100];//纵向—本目录的子目录
};
wenjian *dangqian,*p,*total[100];
int total_num(0);
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int menu()//命令菜单
{
	cout<<ends<<"."<<endl;
	cout<<ends<<".."<<endl;
	cout<<ends<<"MD:在目录文件中创建子目录,同时搜索当前目录最后一个目录项,并保存指针信息"<<endl;
    cout<<ends<<"CD:根据当前目录切换到指定目录"<<endl;
    cout<<ends<<"RD:搜索所要删除的目录是否为空目录,若是则删除"<<endl;
    cout<<ends<<"MK:在当前目录中创建文件名称(申请空间利用位示图修改FAT)"<<endl;
    cout<<ends<<"DEL:搜索所要删除的文件是否存在,若是则删除(恢复位示图修改FAT)"<<endl;
    cout<<ends<<"DIR:列出当前目录的所有目录项"<<endl;
	cout<<ends<<"DIR1:列出当前目录的位示图"<<endl;
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int showweishitu()//显示位示图
{
	int number=p->number;
	while(number)
	{
		cout<<ends<<"file <"<<p->wen[number]->name<<"> 's locate is "<<p->wen[number]->locate<<endl;
		number--;
	}
	for(int i=0;i<10;i++)
	{
		cout<<ends<<ends;
		for(int j=0;j<10;j++)
		{
			cout<<dangqian->weishitu[i][j]<<"\t";
		}
		cout<<endl;
	}
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int establish_cipan()//创建磁盘
{
	total_num++;
	strcpy(dangqian->name,"main_mulu");
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			dangqian->weishitu[i][j]=0;
		}
	}
	dangqian->number=0;
	dangqian->num=0;
	time_t now;
    now=time(0);
	dangqian->tnow=*localtime(&now);
	total[total_num]=dangqian;
	p=total[total_num];
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int xianshi()//显示目录内容
{
	cout<<ends<<1900+p->tnow.tm_year<<"-"<<p->tnow.tm_mon+1<<"-"<<p->tnow.tm_mday<<ends<<p->tnow.tm_hour<<":"<<p->tnow.tm_min<<":"<<p->tnow.tm_sec<<"\t"<<"\t"<<"<DIR>"<<"\t"<<"\t"<<"\t";
	cout<<"."<<endl;
	cout<<ends<<1900+p->tnow.tm_year<<"-"<<p->tnow.tm_mon+1<<"-"<<p->tnow.tm_mday<<ends<<p->tnow.tm_hour<<":"<<p->tnow.tm_min<<":"<<p->tnow.tm_sec<<"\t"<<"\t"<<"<DIR>"<<"\t"<<"\t"<<"\t";
	cout<<".."<<endl;
	int num=p->num;
	int number=p->number;
	while(num)//显示子目录
	{
		cout<<ends<<1900+p->list[num]->tnow.tm_year<<"-"<<p->list[num]->tnow.tm_mon+1<<"-"<<p->list[num]->tnow.tm_mday<<ends<<p->list[num]->tnow.tm_hour<<":"<<p->list[num]->tnow.tm_min<<":"<<p->list[num]->tnow.tm_sec<<"\t"<<"\t"<<"<DIR>"<<"\t"<<"\t"<<"\t";
		cout<<p->list[num]->name<<endl;
		num--;
	}
	while(number)//显示文件
	{
		cout<<ends<<1900+p->wen[number]->tnow.tm_year<<"-"<<p->wen[number]->tnow.tm_mon+1<<"-"<<p->wen[number]->tnow.tm_mday<<ends<<p->wen[number]->tnow.tm_hour<<":"<<p->wen[number]->tnow.tm_min<<":"<<p->wen[number]->tnow.tm_sec<<"\t"<<"\t"<<"\t"<<"\t"<<"\t";
		cout<<p->wen[number]->name<<endl;
		number--;
	}
	cout<<"\t"<<"\t"<<"\t"<<p->number<<" 个文件"<<"        "<<p->num<<" 个目录"<<endl;
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int establish_mulu()//创建目录
{
	p->num++;
	char name[50];
	p->list[p->num]=new wenjian();
p:	cin>>name;
	int num=p->num-1;
	while(num)
	{
		if(!strcmp(name,p->list[num]->name))
		{
			cout<<"\t"<<name<<" list is exist"<<endl;
			goto p;
		}
		num--;
	}
	strcpy(p->list[p->num]->name,name);
	p->list[p->num]->number=0;
	p->list[p->num]->num=0;
	time_t now;
	now=time(0);
	p->list[p->num]->tnow=*localtime(&now);
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int delete_mulu()//删除目录
{
	char name[50];
	cin>>name;
	int num=p->num;
	if(num==0)
	{
		cout<<"\t"<<"There isn't list to delete"<<endl;
	}
	else
	{
		while(num)
		{
			if(!strcmp(p->list[num]->name,name))
			{
				break;
			}
			num--;
		}
		if(num==0)
		{
			cout<<"\t"<<name<<" list isn't exist"<<endl;
		}
		else if(p->list[num]->number==0)
		{
			for(int i=num;i<p->num;i++)
			{
				p->list[i]=p->list[i+1];
			}
			p->num--;
		}
		else if(p->list[num]->number>0)
		{
			cout<<"\t"<<name<<" list isn't empty,so can't delete"<<endl;
		}
	}
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int establish_wenjian()//创建文件
{
	p->number++;
	p->wen[p->number]=new wenjian();
pp:	cin>>p->wen[p->number]->name;
	cin>>p->wen[p->number]->size;
	int size=p->wen[p->number]->size,i,j;
	int num=p->number-1;
	while(num)
	{
		if(!strcmp(p->wen[p->number]->name,p->wen[num]->name))
		{
			cout<<"\t"<<p->wen[num]->name<<" file is exist"<<endl;
			goto pp;
		}
		num--;
	}
	while(true)
	{
		i=rand()%10;
    	j=rand()%10;
    	if(dangqian->weishitu[i][j]==0)
		{
			p->wen[p->number]->locate=10*i+j+1;
			while(true)
			{
		    	int ii=rand()%10;
            	int jj=rand()%10;
            	if(dangqian->weishitu[ii][jj]==0)
				{
					size--;
					if(size==0)
					{
						dangqian->weishitu[i][j]=-1;
					}
					else
					{
						dangqian->weishitu[i][j]=ii*10+jj+1;
			    		i=ii;
			    		j=jj;
					}
					break;
				}
			}
			break;
		}
	}
	if(size>0)
	{
    	while(size>1)
		{
	    	while(true)
			{
		    	int ii=rand()%10;
                int jj=rand()%10;
                if(dangqian->weishitu[ii][jj]==0)
				{
			    	dangqian->weishitu[i][j]=ii*10+jj+1;
			    	i=ii;
			    	j=jj;
			    	break;
				}
			}
	    	size--;
		}
	    dangqian->weishitu[i][j]=-1;
	}
	time_t now;
	now=time(0);
	p->wen[p->number]->tnow=*localtime(&now);
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int delete_file()//删除文件
{
	bool tiaochu(false);
	int delnumber(0);
	char name[50];
	cin>>name;
	int number=p->number;
	if(number==0)
	{
		cout<<"\t"<<"There isn't file to delete"<<endl;
	}
	else
	{
		while(number)
		{
			if(!strcmp(name,p->wen[number]->name))
			{
				delnumber=p->wen[number]->locate;
				for(int i=number;i<p->number;i++)
				{
					p->wen[i]=p->wen[i+1];
				}
				p->number--;
			}
			number--;
		}
		if(delnumber!=0)
		{
    		while(true)
			{
    	    	for(int i=0;i<10;i++)
				{
		        	for(int j=0;j<10;j++)
					{
			        	if(i*10+j+1==delnumber)
						{
				        	if(dangqian->weishitu[i][j]==-1)
							{
						    	tiaochu=true;
					        	dangqian->weishitu[i][j]=0;
					        	break;
							}
				        	else
							{
					        	delnumber=dangqian->weishitu[i][j];
					        	dangqian->weishitu[i][j]=0;
							}
						}
					}
		    		if(tiaochu)
					{
				    	break;
					}
				}
		    	if(tiaochu)
				{
			    	break;
				}
			}
		}
		else if(delnumber==0)
		{
			cout<<"\t"<<name<<" file isn't exist"<<endl;
		}
	}
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int enter()//进入目录
{
	char name[50];
	cin>>name;
	int num=p->num;
	if(num==0)
	{
		cout<<"\t"<<"There isn't list to enter"<<endl;
	}
	else
	{
		while(num)
		{
			if(!strcmp(name,p->list[num]->name))
			{
				total_num++;
				total[total_num]=new wenjian();
				total[total_num]=p->list[num];
				p=p->list[num];
				break;
			}
			num--;
		}
		if(num==0)
		{
	    	cout<<"\t"<<name<<" list isn't exist"<<endl;
		}
	}
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int exit()//退出目录
{
	if(total_num==1)
	{}
	else
	{
		total_num--;
    	p=total[total_num];
	}
	return 0;
}
/*****************************************************************************************************************************/
/*****************************************************************************************************************************/
int main()
{
	dangqian=new wenjian();
	p=new wenjian();
	srand((unsigned)time(NULL));
	establish_cipan();

	char mingling[20];
	while(strcmp(mingling,"exit"))
	{
		cout<<endl;
		int num=1;
		while(num<=total_num)
		{
			cout<<"\\"<<total[num]->name;
			num++;
		}
		cout<<">";
		cin>>mingling;
		if(!strcmp(mingling,"$"))
		{
    		menu();
		}
		else if(!strcmp(mingling,"DIR") || !strcmp(mingling,"dir"))
		{
			xianshi();
		}
		else if(!strcmp(mingling,"cd") || !strcmp(mingling,"CD"))
		{
			enter();
		}
		else if(!strcmp(mingling,"cd..") || !strcmp(mingling,"CD.."))
		{
			exit();
		}
		else if(!strcmp(mingling,"DIR1") || !strcmp(mingling,"dir1"))
		{
			showweishitu();
		}
		else if(!strcmp(mingling,"MD") || !strcmp(mingling,"md"))
		{
			establish_mulu();
		}
		else if(!strcmp(mingling,"RD") || !strcmp(mingling,"rd"))
		{
			delete_mulu();
		}
		else if(!strcmp(mingling,"MK") || !strcmp(mingling,"mk"))
		{
			establish_wenjian();
		}
		else if(!strcmp(mingling,"DEL") || !strcmp(mingling,"del"))
		{
			delete_file();
		}
		else if(!strcmp(mingling,"exit") || !strcmp(mingling,"EXIT"))
		{	
		}
		else
		{
			cout<<"\t"<<mingling<<" isn't exist"<<endl;
		}
	}
	return 0;
}

⌨️ 快捷键说明

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