c++ 华为练习五 内存文件系统

额,我正确率好低啊,又有用例没通过呢,或者这里有什么问题呢?唉。。。

/******************************************************************************

Copyright (C), 2001-2013, Huawei Tech. Co., Ltd.

******************************************************************************
File Name     :
Version       :
Author        :
Created       : 2013/9
Last Modified :
Description   :
Function List :

History       :
1.Date        : 2013/9
Author      :
Modification: Created file

******************************************************************************/
//#include "stdafx.h"
#include "FileManager.h"
#include <string>
map<string,Dir> dir;
map<string,File> file;
Dir root=Dir();

Dir::Dir(){
	name="root";
	father=NULL;
	//dirnum=0;
	//filenum=0;
	//isroot=true;
	dir.insert(pair<string,Dir>("root",root));
}
Dir::Dir(Dir *fath,string dirname){
	name=dirname;
	father=fath;
	//dirnum=0;
	//filenum=0;
	//isroot=true;
}

File::File(Dir *f){
	//name=file;
	father=f;
}




int CreateDir(const char * ParentDirName, const char * DirName)
{
	if(dir.count(ParentDirName)&&!dir.count(DirName)){
		map<string,Dir>::iterator p;
		p=dir.find(ParentDirName);
		Dir newdir(&p->second,DirName);
		dir.insert(pair<string,Dir>(DirName,newdir));
		return 0;
	}




    return -1;
}

void DeleteDir(const char * DirName)
{
	
		if(DirName!="root"&&dir.count(DirName)){
		map<string,Dir>::iterator p;
		p=dir.find(DirName);
		map<string,Dir>::iterator it;
		it=dir.begin();
		map<string,File>::iterator ip;
		ip=file.begin();
		//dir.erase(p);
		//p=dir.begin();




		for(int i=0;i<dir.size();i++){
			if(it->first=="root"){
			it++;
			}else if(it->second.father->name==p->second.name){
				DeleteDir(it->first.c_str());
				i=-1;
				it=dir.begin();
			}else{

			it++;
			}
		}
		for(int i=0;i<file.size();i++){
			if(ip->first=="root"){
			ip++;
			}else if(ip->second.father->name==p->second.name){
				DeleteFile(ip->first.c_str());
				i=-1;
				ip=file.begin();
				
			}else{
			ip++;
			}
		}
		dir.erase(p);
		}
    return;
}

int MoveDir(const char * SrcDirName, const char * DestDirName)
{
	if(dir.count(SrcDirName)&&dir.count(DestDirName)){
		if(SrcDirName=="root")return -1;
		if(SrcDirName==DestDirName)return -1;
		map<string,Dir>::iterator p;
		p=dir.find(DestDirName);
		map<string,Dir>::iterator q;
		q=dir.find(SrcDirName);
		map<string,Dir>::iterator f;
		f=p;
		if(q->second.father->name==p->second.name)return -1;//当移动路径为目标路径的子目录时,不能移动
		while(f->first!="root"){//遍历到根目录,判断目标目录是否为移动目录的子目录
			if(f->second.father->name==q->second.name)return -1;
			f=dir.find(f->second.father->name);
		}

		q->second.father=&p->second;
    return 0;
	}
	return -1;
}

int CreateFile(const char * DirName, const char * FileName)
{
	if(dir.count(DirName)&&!file.count(FileName)){
		map<string,Dir>::iterator p;
		p=dir.find(DirName);
		File newf(&p->second);
		file.insert(pair<string,File>(FileName,newf));
return 0;
	}
    return -1;
}

void DeleteFile(const char * FileName)
{
	if(file.count(FileName)){
		map<string,File>::iterator ip;
		ip=file.find(FileName);
		file.erase(ip);
	}

    return;
}

unsigned int GetFileNum(const char * DirName)
{

	if(!dir.count(DirName)){
    return 0;
	}
	else{
map<string,Dir>::iterator p;
		p=dir.find(DirName);
		int n=0;
		map<string,Dir>::iterator it;
		it=dir.begin();
		map<string,File>::iterator ip;
		ip=file.begin();
		for(int i=0;i<dir.size();i++){
			if(it->first=="root"){
			//it++;
			}else if(it->second.father->name==p->second.name){
				n+=GetFileNum(it->first.c_str());
			}
			//if(it==dir.end())break;
			it++;
			
		}
		for(int i=0;i<file.size();i++){
			if(ip->first=="root"){
			//ip++;
			}else if(ip->second.father->name==p->second.name){
				n++;
				
				
			}
			ip++;

		}

		return n;

	}
}

void Clear(void)
{
	map<string,Dir>::iterator p;
	p=dir.begin();
	for(int i=0;i<dir.size();i++){
		if(p->first=="root"){
			p++;
		}
		else if(p->second.father->name=="root"){
			DeleteDir(p->first.c_str());
		i=-1;
		p=dir.begin();
		}else{
			p++;
		}
	}
	map<string,File>::iterator q;
	q=file.begin();
	for(int i=0;i<file.size();i++){
		if(q->second.father->name=="root"){
			DeleteFile(q->first.c_str());
			q=file.begin();
			i=-1;
		}else{
			q++;
		}

	}
    return;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值