#include<iostream>
#include<list>
#include<map>
#include<string>
#include<algorithm>
typedef void(*cmd_fun)() ;
std::string command;
std::string var;
std::map<std::string,cmd_fun> cmd_map;
typedef std::map<std::string,cmd_fun>::iterator itr_t;
struct Dir
{
friend bool operator==(const Dir&l,const Dir& r);
Dir():fdir(NULL){};
std::string name;
Dir* fdir;
std::list<Dir*> dirs;
std::list<std::string> files;
};
bool operator==(const Dir& l,const Dir& r)
{
return (l.name==r.name);
}
Dir root;
Dir* cur_dir;
class cmp_dir
{
public:
cmp_dir(std::string str)
{
this->str.assign(str);
}
bool operator()(const Dir* dir)
{
if(dir->name==str){
return true;
}
return false;
}
private:
std::string str;
};
void CD()
{
int pos1=0,pos2=var.size();
std::list<Dir*>::iterator itr;
if(var[0]=='\\'){
cur_dir=&root;
pos1++;
std::cout<<"success"<<std::endl;
return;
}
if(var.substr(0,2)==".."){
if(cur_dir->fdir!=NULL){
cur_dir=cur_dir->fdir;
}
std::cout<<"success"<<std::endl;
return;
}
itr=std::find_if(cur_dir->dirs.begin(),cur_dir->dirs.end(),cmp_dir(var.substr(pos1,pos2-pos1)));
if(itr!=cur_dir->dirs.end()){
cur_dir=*itr;
std::cout<<"success"<<std::endl;
}else{
std::cout<<"no such directory"<<std::endl;
}
}
void MD()
{
if(var==".."){
std::cout<<"directory already exist"<<std::endl;
}
std::list<Dir*>::iterator itr;
itr=std::find_if(cur_dir->dirs.begin(),cur_dir->dirs.end(),cmp_dir(var));
if(itr==cur_dir->dirs.end()){
Dir* dir=new Dir();
dir->fdir=cur_dir;
dir->name=var;
cur_dir->dirs.push_back(dir);
std::cout<<"success"<<std::endl;
}else{
std::cout<<"directory already exist"<<std::endl;
}
}
void RD()
{
std::list<Dir*>::iterator itr;
itr=std::find_if(cur_dir->dirs.begin(),cur_dir->dirs.end(),cmp_dir(var));
if(itr!=cur_dir->dirs.end()&&(*itr)->dirs.empty()&&(*itr)->files.empty()){
cur_dir->dirs.erase(itr);
std::cout<<"success"<<std::endl;
}else{
std::cout<<"can not delete the directory"<<std::endl;
}
}
void CREAT()
{
std::list<std::string>::iterator itr;
itr=std::find(cur_dir->files.begin(),cur_dir->files.end(),var);
if(itr==cur_dir->files.end()){
cur_dir->files.push_back(var);
std::cout<<"success"<<std::endl;
}else{
std::cout<<"file already exist"<<std::endl;
}
}
void DELETE()
{
std::list<std::string>::iterator itr;
itr=std::find(cur_dir->files.begin(),cur_dir->files.end(),var);
if(itr!=cur_dir->files.end()){
cur_dir->files.erase(itr);
std::cout<<"success"<<std::endl;
}else{
std::cout<<"no such file"<<std::endl;
}
}
void cmd()
{
itr_t itr;
while (std::cin>>command>>var){
itr=cmd_map.find(command);
if(itr!=cmd_map.end()){
cmd_map[command]();
}
}
}
int main()
{
cmd_map.insert(std::make_pair("CD",CD));
cmd_map.insert(std::make_pair("MD",MD));
cmd_map.insert(std::make_pair("RD",RD));
cmd_map.insert(std::make_pair("CREATE",CREAT));
cmd_map.insert(std::make_pair("DELETE",DELETE));
cur_dir=&root;
cmd();
}
HDU-1413文件系统
最新推荐文章于 2022-06-27 13:56:24 发布