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

📄 mdomain.cpp

📁 MDO1铺设好了数据结构和主调函数。但是发现在输出显示目录和添加删除时比较麻烦
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include<iomanip.h>
#include <time.h>
#include<dos.h>
#include <afx.h> 
#include "DFattribute.h"
#define maxDFnum  100

typedef struct   //定义输出路径的栈
{
	int data[maxDFnum];
	int top;
}seqstack;

DFattribute  DFobj[maxDFnum];
time_t now;
int DFnum=0; //记录DFobj个数
int nowD,fathD; //记录当前目录,父目录

void GetPath(int i) //由当前目录查找到根目录并输出显示出来
{
	seqstack *s;
	s=(seqstack *)malloc(sizeof(seqstack));
	s->top=-1; //置空栈
	do{
    	if((DFobj[i].type=='D')&&(i!=0))
		{
           s->top++;
		   s->data[s->top]=i;
		   i=DFobj[i].FatherDir;
		}
		else
	       i=DFobj[i].FatherDir;
	}while(i!=0);
	if(s->top==-1)
		cout<<"\\";
	else 
    while(s->top!=-1) 
	{
  	    cout<<"\\"<<DFobj[s->data[s->top]].Name;
		s->top--;
	}
}

int JugPath(char DFname[100]) //判断路径是否存在当前目录下,是则返回最后DF的nowDF,否则返回0
{
	char buf[20];
	int l;
    if(DFname[0]=='\\') //处理\gdsjog***的
	{
		l=0;
		buf[0]='\\';
		buf[1]='\0';
	}
	else
		l=nowD;
	if(DFname[strlen(DFname)-1]=='\\') //处理****gae\形式的
		DFname[strlen(DFname)-1]='\0';
	for(int i=0,j=0;i<(int)strlen(DFname)+1;i++)  //处理形如 abcde\dede\oweog的形式
	{
        if((DFname[i]!='\\')&&(DFname[i]!='\0'))
		{
			buf[j]=DFname[i];
			buf[j+1]='\0';
			j++;
		}
		else
		{
			j=0;
			for(int k=0;k<DFnum;k++)
			{
				if((strcmp(buf,DFobj[k].Name)==0)&&(l==DFobj[k].FatherDir)&&(DFobj[k].type=='D'))
				{
					l=DFobj[k].NowDir;
					break;
				}
				if((k==DFnum-1)&&((strcmp(buf,DFobj[k].Name)!=0)||(l!=DFobj[k].FatherDir)||(DFobj[k].type!='D')))
					l=-1;
			}
		}
		if(l==-1)
			break;
	}
	if(l==-1)
  	    cout<<"系统找不到指定的路径。"<<endl;
	return l;
}

void MD(char *DFname)
{
/*	char buf[20];
	int l;
	if((strcmp(DFname,"\\\\")==0))
		cout<<"文件名,目录名或卷标语法不正确。"<<endl;

    else
	{
		if(DFname[0]=='\\') //处理\gdsjog***的	
		{		
			l=0;		
			buf[0]='\\';		
			buf[1]='\0';	
		}	
		else		
			l=nowD;	
		if(DFname[strlen(DFname)-1]=='\\') //处理****gae\形式的
			DFname[strlen(DFname)-1]='\0';
	}
	for(int i=0,j=0;i<(int)strlen(DFname)+1;i++)  //处理形如 abcde\dede\oweog的形式
	{
        if((DFname[i]!='\\')&&(DFname[i]!='\0'))
		{
			buf[j]=DFname[i];
			buf[j+1]='\0';
			j++;
		}
		else
		{
			j=0;
			for(int k=0;k<DFnum;k++)
			{
				if((strcmp(buf,DFobj[k].Name)==0)&&(l==DFobj[k].FatherDir)&&(DFobj[k].type=='D'))
				{
					cout<<"子目录或文件 "<<DFname<<" 已经存在。"<<endl;
					break;
				}
				if((k==DFnum-1)&&((strcmp(buf,DFobj[k].Name)!=0)||(l!=DFobj[k].FatherDir)||(DFobj[k].type!='D')))
					l=-1;
			}
		}
		if(l==-1)
			break;
	}
	if(l==-1)
  	    cout<<"系统找不到指定的路径。"<<endl;*/
    int repeat=0;
    for(int k=0;k<DFnum;k++)
	{
		if((strcmp(DFname,DFobj[k].Name)==0)&&(nowD==DFobj[k].FatherDir))
		{
			cout<<"子目录或文件 "<<DFname<<" 已经存在。"<<endl;
			repeat=1;
		    break;
		}
		if((k==DFnum-1)&&((strcmp(DFname,DFobj[k].Name)!=0)||(nowD!=DFobj[k].FatherDir)))
            repeat=0;
	}
	if(repeat==0)
	{
        time(&now);
        strcpy(DFobj[DFnum].CreateTime,ctime(&now));
        DFobj[DFnum].bu=0;
        strcpy(DFobj[DFnum].Name,DFname);
        DFobj[DFnum].NowDir=DFnum+1;
        DFobj[DFnum].FatherDir=nowD;
        DFobj[DFnum].type='D';
        DFnum++;
	}
}

void MK(char *DFname)
{
   int repeat=0;
    for(int k=0;k<DFnum;k++)
	{
		if((strcmp(DFname,DFobj[k].Name)==0)&&(nowD==DFobj[k].FatherDir))
		{
			cout<<"子目录或文件 "<<DFname<<" 已经存在。"<<endl;
			repeat=1;
		    break;
		}
		if((k==DFnum-1)&&((strcmp(DFname,DFobj[k].Name)!=0)||(nowD!=DFobj[k].FatherDir)))
            repeat=0;
	}
	if(repeat==0)
	{
        time(&now);
        strcpy(DFobj[DFnum].CreateTime,ctime(&now));
        DFobj[DFnum].bu=0;
        strcpy(DFobj[DFnum].Name,DFname);
        DFobj[DFnum].NowDir=DFnum+1;
        DFobj[DFnum].FatherDir=nowD;
        DFobj[DFnum].type='F';
        DFnum++;
	}
}

void CD(char *DFname)
{
	int i;
	if(strcmp(DFname,".")==0)
		;
	else if(strcmp(DFname,"..")==0)
		for(int j=0;j<DFnum;j++)
			if(nowD==DFobj[j].NowDir)
			{
				nowD=DFobj[j].FatherDir;
				break;
			}
			else
				;
	else if(strcmp(DFname,"\\\\")==0)
	{
	    cout<<"'\\\\'"<<endl;
		cout<<"CMD 不支持将 UNC 路径作为当前目录。"<<endl;
	}
    else
	{
		i=JugPath(DFname);
		if(i!=-1)
			nowD=i;
	}
    cout<<endl;
}

void DIR()
{
    char DFname[100];
	DFname[0]=getchar();
	if(DFname[0]=='\n')
	{
	int Dnum=0,Fnum=0;
	cout<<endl;
	cout<<" ";
	GetPath(nowD);
	cout<<" 的目录"<<endl;
    cout<<endl;
	for(int j=0;j<DFnum;j++)
	{
		if(DFobj[j].FatherDir==nowD)
            DFobj[j].print();
		if((DFobj[j].type=='D')&&(DFobj[j].FatherDir==nowD))
            Dnum++;
		if((DFobj[j].type=='F')&&(DFobj[j].FatherDir==nowD))
            Fnum++;
	}
	cout<<resetiosflags(ios::left)<<setw(20)<<Fnum<<" 个文件"<<endl;
	cout<<resetiosflags(ios::left)<<setw(20)<<Dnum<<" 个目录"<<endl;
    cout<<endl;
	}
}

void RD(char *DFname)
{
    for(int k=0;k<DFnum;k++)
	{
		if((strcmp(DFname,DFobj[k].Name)==0)&&(nowD==DFobj[k].FatherDir)&&(DFobj[k].type=='D'))
		{
			for(int m=0;m<DFnum;m++)
			{
				if(DFobj[m].FatherDir==DFobj[k].NowDir)
				{
					cout<<"目录不是空的。"<<endl;
					break;
				}
				if((m==DFnum-1)&&(DFobj[m].FatherDir!=DFobj[k].NowDir))
				{
					for(int m1=k;m1<DFnum;m1++)
				      DFobj[m1]=DFobj[m1+1];
                    DFnum--;
					break;
				}
			}
		    break;
		}
		if((k==DFnum-1)&&((strcmp(DFname,DFobj[k].Name)!=0)||(nowD!=DFobj[k].FatherDir)||(DFobj[k].type!='F')))
			cout<<"系统找不到指定的目录。"<<endl;
	}
}

void DEL(char *DFname)
{
    for(int k=0;k<DFnum;k++)
	{
		if((strcmp(DFname,DFobj[k].Name)==0)&&(nowD==DFobj[k].FatherDir)&&(DFobj[k].type=='F'))
		{
			for(int m=k;m<DFnum;m++)
				DFobj[m]=DFobj[m+1];
            DFnum--;
		    break;
		}
		if((k==DFnum-1)&&((strcmp(DFname,DFobj[k].Name)!=0)||(nowD!=DFobj[k].FatherDir)||(DFobj[k].type!='F')))
			cout<<"文件 "<<DFname<<" 不存在。"<<endl;
	}
}

void initialize()
{
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"\\");
    DFobj[DFnum].NowDir=0;
	DFobj[DFnum].FatherDir=0;
	DFobj[DFnum].type='D';
    DFnum++;
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"J1");
    DFobj[DFnum].NowDir=1;
	DFobj[DFnum].FatherDir=0;
	DFobj[DFnum].type='D';
    DFnum++;
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"J2");
    DFobj[DFnum].NowDir=2;
	DFobj[DFnum].FatherDir=0;
	DFobj[DFnum].type='D';
    DFnum++;
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"J3");
    DFobj[DFnum].NowDir=3;
	DFobj[DFnum].FatherDir=0;
	DFobj[DFnum].type='F';
    DFnum++;
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"J1");
    DFobj[DFnum].NowDir=4;
	DFobj[DFnum].FatherDir=2;
	DFobj[DFnum].type='D';
    DFnum++;
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"F1");
    DFobj[DFnum].NowDir=5;
	DFobj[DFnum].FatherDir=2;
	DFobj[DFnum].type='F';
    DFnum++;
	time(&now);
	strcpy(DFobj[DFnum].CreateTime,ctime(&now));
    DFobj[DFnum].bu=0;
    strcpy(DFobj[DFnum].Name,"F2");
    DFobj[DFnum].NowDir=6;
	DFobj[DFnum].FatherDir=4;
	DFobj[DFnum].type='F';
    DFnum++;
}

void main()
{
	char order[10],DFname[100],getstr[110];
	nowD=0;fathD=0;
	initialize();
	for(int j=0;j<DFnum;j++)
        DFobj[j].print();
	cout<<"-----多级目录管理-----"<<endl;
	cout<<"MD    创建一个子目录"<<endl;
	cout<<"Mk    创建一个文件"<<endl;
	cout<<"CD    进入一个子目录"<<endl;
	cout<<"DIR   列出当前目录下内容"<<endl;
	cout<<"RD    删除一个空目录"<<endl;
	cout<<"DEL   删除文件"<<endl;
	cout<<"EXIT  退出程序"<<endl;
	for(;;)
	{	
        GetPath(nowD);
	    cout<<">";
        cin>>order;
		scanf("%s",getstr);
        
		if((strcmp(order,"exit")==0)||(strcmp(order,"EXIT")==0))
			exit(0);
		else if((strcmp(order,"dir")==0)||(strcmp(order,"DIR")==0))
				DIR();
		else
		{
			cin>>DFname;
            if((strcmp(order,"md")==0)||(strcmp(order,"MD")==0))
				MD(DFname);
			else if((strcmp(order,"mk")==0)||(strcmp(order,"MK")==0))
				MK(DFname);
			else if((strcmp(order,"cd")==0)||(strcmp(order,"CD")==0))
				CD(DFname);
			else if((strcmp(order,"rd")==0)||(strcmp(order,"RD")==0))
				RD(DFname);
			else if((strcmp(order,"del")==0)||(strcmp(order,"DEL")==0))
				DEL(DFname);
			else
				cout<<"'"<<order<<"' 不是内部或外部命令。"<<endl;
		}
	}
}

⌨️ 快捷键说明

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