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

📄 filesystem.cpp

📁 操作系统文件管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    outputUrl();
	return 1;
}

int filesystem::rd()
{
    struct fcb *p,*f;
    if(locateDir(0)==0)
	{
	    printf("系统找不到指定文件\n");
		goto over;
	}
	f=present;/////////////////////////////////////////////////
    p=present->child;
	while(p!=NULL)
	{
		if(p->type==F)
			continue;
	    if(strcmp(p->filename,dirs.dir[dirs.i-1])==0)
			break;
		f=p;
		p=p->rightbrother;
	}
	if(p==NULL)
		printf("系统找不到指定文件\n");
	else if(p->child!=NULL)
		printf("目录不为空\n");
	else if(p==predir)
		printf("另一个程序正在使用此文件,进程无法访问\n");
	else if(f==present)
		f->child=p->rightbrother;
	else
		f->rightbrother=p->rightbrother;
over:
    outputUrl();
	return 1;
}

void filesystem::tree(struct fcb *predir,int n)
{
	struct fcb *p;
	p=predir->child;
	if(p!=NULL)		
	while(p!=NULL)
	{			
	    if(p->type==DIR)
		{
			for(int i=0;i<n;i++)
				printf("\|    ");
			printf("\|____%s\n",p->filename);
			tree(p,n+1);
		}
		p=p->rightbrother;
	}
	else if(n==0)
		printf("没有子文件夹\n");
    return;
}

void filesystem::getCmd()
{
	char cmdtype[10];
	int i=0,times=0;
    gets(cmd);
	cp=0;
	times++;
	while(cmd[cp]==' ')
	{
	    cp++;
	}
//	cmdtype[i]=cmd[cp];
	while(cmd[cp]!=' '&&cmd[cp]!='\0')
	{
	    cmdtype[i]=cmd[cp];
		i++;
		cp++;
	}
	if(cmd[cp]==' ')
	    cp++;	
	dc=cp;
	cmdtype[i]='\0';
	analysisCmd();
	if(strcmp(cmdtype,"md")==0)
		md();
	else if(strcmp(cmdtype,"dir")==0)
		dir();
	else if(strcmp(cmdtype,"rd")==0)
		rd();
	else if(strcmp(cmdtype,"tree")==0)
		outputTree();
	else if(strcmp(cmdtype,"mk")==0)
		mk();
	else if(strcmp(cmdtype,"del")==0)
		del();
	else if(strcmp(cmdtype,"cd")==0)
		cd();
//---------------------------------------------
	else if(strcmp(cmdtype,"c:")==0)
	{
	    printf("\nC:\\>");
		strcpy(url,"C:\\");
		front=c;
		present=c;
		predir=c;
		pd.db[dp].state=0;
		pd.p=0;
		dp=0;
		pd.db[dp].state=1;	
		getCmd();
	}
	else if(strcmp(cmdtype,"d:")==0)
	{
	    printf("\nD:\\>");
		strcpy(url,"D:\\");
		front=d;
		present=d;
		predir=d;
		pd.db[dp].state=0;
		pd.p=1;
		dp=1;
		pd.db[dp].state=1;	
		getCmd();
	}
	else if(strcmp(cmdtype,"e:")==0)
	{
	    printf("\nE:\\>");
		strcpy(url,"E:\\");
		front=e;
		present=e;
		predir=e;
		pd.db[dp].state=0;
		pd.p=2;
		dp=2;
		pd.db[dp].state=1;	
		getCmd();
	}
	else if(strcmp(cmdtype,"f:")==0)
	{
	    printf("\nF:\\>");
		strcpy(url,"F:\\");
		front=f;
		present=f;
		predir=f;
		pd.db[dp].state=0;
		pd.p=3;
		dp=3;
		pd.db[dp].state=1;	
		getCmd();
	}
//---------------------------------------------
	else if(strcmp(cmdtype,"fat")==0)
		outFat();
	else if(strcmp(cmdtype,"sfree")==0)
		weishitu();
	else if(strcmp(cmdtype,"help")==0)
		help();
	else if(strcmp(cmdtype,"exit")==0)
		exit_();
	else if(cmdtype[0]=='\0')
		outputUrl();
	else
	{
		cout<<"'"<<cmdtype<<"'"<<"不是内部或外部命令,也不是可运行程序或批处理文件"<<endl;
	//	if(times==1)
			outputUrl();
	}
}

void filesystem::help()
{
    cout<<"md     创建子目录。"<<endl; 
	cout<<"cd     定位目录。"<<endl; 
	cout<<"rd     删除空子目录。"<<endl; 
	cout<<"dir    列出当前目录对象。"<<endl; 
	cout<<"tree   显示树形目录。"<<endl; 
	cout<<"mk     创建文件。"<<endl; 	
	cout<<"del    删除文件。"<<endl; 
	cout<<"fat    查看FAT表。"<<endl; 
	cout<<"sfree  查看位视图。"<<endl; 
	cout<<"help   提供命令帮助信息。"<<endl; 
	cout<<"exit   退出CMD.EXE程序(命令解释程序)。"<<endl; 

	outputUrl();
}

void filesystem::exit_()
{
    exit(0);
//	system("exit"); 
}

int filesystem::analysisCmd()
{
	int j; 
//先清空dir.dir[]中原有内容
	for(j=0;j<dirs.i;j++)
		strcpy(dirs.dir[j],"");
    dirs.i=0;
//	if(strcmp(cmd,"cd \\")==0)
	if(cmd[cp]=='\\')
	{
//	    strcpy(dirs.dir[0],"\\");
		dirs.dir[0][0]='\\';
		dirs.dir[0][1]='\0';
		dirs.i++;
		cp++;
	//	return 1;
	}
	while(cmd[cp]!='\0')
	{
		j=0;
		while(cmd[cp]!='\\'&&cmd[cp]!='\0')
		{
		    dirs.dir[dirs.i][j]=cmd[cp];
			j++;
			cp++;
		}
		dirs.dir[dirs.i][j]='\0';
		if(cmd[cp]!='\0')
			cp++;
		dirs.i++;
	}
	return 1;
}

int filesystem::locateDir(int type)
{
    int i,j;
	struct fcb *p,*t;
	char turl[100];
	strcpy(turl,url);//保存URL
	i=0;
	present=predir;	
	if(strcmp(dirs.dir[i],".")==0)
	{
		i=1;
		present=present;
		//url不变
	}
	else if(strcmp(dirs.dir[i],"..")==0)
	{
		i=1;
		present=present->father;
		j=0;
		while(url[j]!='\0'){j++;}//找到末尾
		while(url[j]!='\\'){j--;}//退一级
		if(url[j-1]==':')//已退到根目录
		{
			url[2]='\\';
			url[3]='\0';
		}
		else
		   url[j]='\0';
	}
	else if(strcmp(dirs.dir[i],"\\")==0)
	{		 
		i=1;
		switch(pd.p)
		{
		case 0: present=c; strcpy(url,"C:\\"); break;
		case 1: present=d; strcpy(url,"D:\\"); break;
		case 2: present=e; strcpy(url,"E:\\"); break;
		case 3: present=f; strcpy(url,"F:\\"); break;
		}
	}
	else
	{
		i=0;
	}
	p=NULL;
	t=present;
	for(i;i<dirs.i-1;i++)
	{	    
		p=t->child;
		while(p!=NULL)
		{
			if(p->type==F)
				continue;
		    if(strcmp(p->filename,dirs.dir[i])==0)
			{
				t=p;
				if(url[3]!='\0')
					strcat(url,"\\");
				strcat(url,p->filename);			
				break;
			}
			p=p->rightbrother;
		}
		if(p==NULL)//找不到路径,返回原来的url
		{
			strcpy(url,turl);
			return 0;
		}
	}
	if(type!=CD)
		strcpy(url,turl);//返回原来的URL
	if(p!=NULL)
    	present=p;
	return 1;
}

void filesystem::outputTime(fcb *p)
{
    printf("%d",(p->createtime).wYear);
	printf("-");
	printf("%d",(p->createtime).wMonth);
	printf("-");
	printf("%d",(p->createtime).wDay);
	printf("  ");
	printf("%2d",(p->createtime).wHour);
	printf(":");
	printf("%2d",(p->createtime).wMinute);
	printf("   ");
}

void filesystem::run()
{
    outputUrl();
}

void filesystem::outputUrl()
{
    printf("\n%s",url);
	printf(">");
	getCmd();
}

void filesystem::outputTree()
{
	int n=0,i=dirs.i-1;
	struct fcb *p;
	char tempurl[50];
	strcpy(tempurl,url);
	if(dirs.i==0)
	{
		p=predir;
		goto next;
	}
	if(locateDir(0)==0)
	{
		if(url[3]!='\0')
		    strcat(tempurl,"\\");
		strcat(tempurl,(cmd+dc));
	    printf("无效的路径 - %s\n",tempurl);
	    printf("没有子文件夹\n");
		goto over;
	}
	if(strcmp(dirs.dir[i],".")==0||strcmp(dirs.dir[i],"..")==0||strcmp(dirs.dir[i],"\\")==0)
	    p=present;
	else
	{
	    p=present->child;
		while(p!=NULL)
		{
		    if(p->type==F)
			{
			    p=p->rightbrother;
				continue;
			}
			if(strcmp(p->filename,dirs.dir[dirs.i-1])==0)
				break;
			p=p->rightbrother;
		}
		if(p==NULL)
		{
			strcat(tempurl,"\\");
		    strcat(tempurl,(cmd+dc));
	        printf("无效的路径 - %s\n",tempurl);
			printf("没有子文件夹\n");
		    goto over;
		}
	}
next:
	printf("文件夹 PATH 列表\n");
	printf("卷的序列号码为 0006EEA4 ");
	switch(pd.p)
	{
	case 0: printf("F858:4A70\nC:.\n"); break;
	case 1: printf("4812:9B67\nD:.\n"); break;
	case 2: printf("18C3:4A5B\nE:.\n"); break;
	case 3: printf("1472:2FF7\nF:.\n"); break;
	}
    tree(p,n);
over:
	outputUrl();
}

int filesystem::mohupipei(char ch[])
{
    char name[40];
	int i=0,j=0,star=0;
	strcpy(name,dirs.dir[dirs.i-1]);
	while(ch[i]!='\0'&&name[j]!='\0')
	{/*
		if(ch[i]=='.'||name[j]=='.')
		{
		    if(ch[i]==name[j])
			{
			    i++;
				j++;
				continue;
			}
			else break;
		}*/		
		if(star==1)//上一个字符是*
		{
			star=0;
			if(name[j]=='.')
			{
				while(ch[i]!='\0'&&ch[i]!='.'){i++;}
				if(ch[i]=='\0')
					break;
				i++;
				j++;
				continue;
			}
			if(name[j]=='?')
			{
			    i++;
				j++;
				star=0;
				continue;
			}
		    while(ch[i]!=name[j]&&ch[i]!='\0')
			{
			    i++;
			}
			if(ch[i]!='\0')
			{
			    i++;
				j++;
				star=0;
				continue;
			}
			else break;
		}
	    else if(ch[i]==name[j]||name[j]=='?')
		{
		    i++;
			j++;
			continue;
		}
		else if(name[j]=='*')
		{
		    j++;
			star=1;
		}
		else break;
	}
	if(star==1)
		return 1;
	if(ch[i]=='\0'&&name[j]=='\0')
		return 1;
	return 0;
}

int filesystem::spaceDistribute(int n)
{
    int i,first=-1,f,j=0;
	for(i=0;i<1000;i++)
	{
	    if(space[i]==0)
		{
			first=i;
			space[i]=1;
			j=1;
			break;
		}
	}
	f=first;
	if(f!=-1)
	{
	    for(i;i<1000;i++)
		{
		    if(j==n)
				break;
	        if(space[i]==0)
			{
			    fat[f]=i;
				f=i;
				space[i]=1;
				j++;
			}
		}
		if(j<n)
		{
			printf("磁盘空间不足\n");
			return -1;
		}
	}
    return first;
}

void filesystem::weishitu()
{
    int i;
	for(i=0;i<1000;i++)
	{
		if(i%10==0)
			printf("\n");
	    printf("%d  ",space[i]);
	}   
	outputUrl();
}

void filesystem::outFat()
{
	int i;
	for(i=1;i<1001;i++)
	{
		if(i%10==0)
			printf("\n");
	    printf("%d  ",fat[i-1]);
	}   
	outputUrl();
}

int filesystem::back(int first,int n)
{
    int i=0,f,t;
	f=first;
	t=f;
	for(i;i<n;i++)
	{
	    space[f]=0;
		f=fat[f];	
		fat[t]=-1;
		t=f;
	}
	return 1;
}

⌨️ 快捷键说明

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