使用ACE递归查找文件的跨平台实现

8 views
Skip to first unread message

louis.a...@gmail.com

unread,
Mar 26, 2008, 4:35:37 AM3/26/08
to simple code team
#include <string>
#include <map>
#include <vector>
using namespace std;

///////include ace block///////
#include "ace/ARGV.h"
#include "ace/Get_Opt.h"
#include "ace/OS.h"

#include <stdio.h>

#define _T(x) x

typedef vector<string> string_vector;
typedef map<int, string_vector> string_vector_map;
enum
mif_file_type{R_MIF,N_MIF,C_MIF,COND_MIF,CNL_MIF,CR_MIF,DM_MIF,BR_MIF,IC_MIF,DR_MIF,LN_MIF,B_MIF,D_MIF,DL_MIF,T_MIF,P_MIF,Z_MIF,A_MIF,AC_MIF,UNKOWN_MIF};

const string mid_type = _T(".mid");
const string MID_TYPE = _T(".MID");

class mydir
{
public:
void get_one_dir(const string& parent, const string& dir_name);
bool comparer(const string& name, const string& key);
bool file_type_is_available(const string& str_file);
mif_file_type get_file_type(const string& str_path_file);

string str_exe_path;//应用程序所在目录的绝对路径
string str_dat_path;//MIF数据所在目录的绝对路径
vector<int> file_type_vec;//MIF1.3.1版的数据类型
string_vector_map file_array;//按类型管理的MIF数据文件的绝对路径
};

void mydir::get_one_dir(const string& parent, const string& dir_name)
{
ACE_DIR* base_dir = ACE_OS::opendir(parent.c_str());//打开父目录,并返回目录句柄
if(base_dir == NULL)
{
if(comparer(dir_name.c_str(), mid_type/*key of ext name*/) ||
comparer(dir_name.c_str(), MID_TYPE/*key of ext name*/))//比较文件扩展名
{
if(file_type_is_available(dir_name.c_str()))//判断文件类型是否是命令行参数传递进来的要处理
的文件类型
{
int i_file_type = get_file_type(dir_name);//根据文件名获取数据类型
string_vector_map::iterator it_file_array =
file_array.find(i_file_type);
if(it_file_array != file_array.end())
{
it_file_array->second.push_back(parent);
}
else
{
string_vector path_array;
path_array.push_back(parent);
file_array.insert(string_vector_map::value_type(i_file_type,
path_array));
}
}
}
}
else
{
struct ACE_DIRENT * dir = NULL;
while((dir = ACE_OS::readdir(base_dir)) != NULL)//根据目录句柄获取该目录下包含的一下个目

{
string str_ext = dir->d_name;
if(str_ext != "." && str_ext != "..")
{
if(parent.find('\\') != string::npos)//windows下的目录递归
{
get_one_dir(parent + '\\' + dir->d_name, string(dir->d_name));
}
else//linux下的目录递归
{
get_one_dir(parent + '/' + dir->d_name, string(dir->d_name));
}
}
}
ACE_OS::closedir(base_dir);//关闭目录
}
}

bool mydir::comparer(const string& name, const string& key)
{
if(string::npos != name.find(key))
{
return true;
}
return false;
}

bool mydir::file_type_is_available(const string& str_file)
{
int i_type = get_file_type(str_file);
assert(i_type != UNKOWN_MIF);
if(find(file_type_vec.begin(), file_type_vec.end(), i_type) !=
file_type_vec.end())
return true;
return false;
}

mif_file_type mydir::get_file_type(const string& str_file)
{
char ch_first ;
char ch_second;
string::size_type i_len = str_file.length();
if(0 == i_len)
return(UNKOWN_MIF);
assert(i_len > 2);
ch_first = str_file.at(0);
ch_second = str_file.at(1);
switch (ch_first)
{
case _T('N'):
return(N_MIF);
case _T('R'):
return(R_MIF);
case _T('C'):
if (_T('o') == ch_second)
return(COND_MIF);
else if (_T('N') == ch_second)
return(CNL_MIF);
else if (_T('R') == ch_second)
return(CR_MIF);
else
return(C_MIF);
break;
case _T('I'):
if (ch_second == _T('C'))
return(IC_MIF);
else
return(UNKOWN_MIF);
break;
case _T('B'):
if (_T('r') == ch_second)
return(BR_MIF);
else
return(B_MIF);
case _T('D'):
if (_T('r' == ch_second))
return(DR_MIF);
else if (_T('m') == ch_second)
return(DM_MIF);
else if (_T('L') == ch_second)
return(DL_MIF);
else
return(D_MIF);
break;
case _T('L'):
return(LN_MIF);
case _T('T'):
return(T_MIF);
case _T('P'):
return(P_MIF);
case _T('Z'):
return(Z_MIF);
case _T('A'):
if (_T('c') == ch_second)
{
if(str_file == "Achongqing.mid")
return(A_MIF);
else
return(AC_MIF);
}
else
return(A_MIF);
default:
return(UNKOWN_MIF);
}
return UNKOWN_MIF;
}

int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
mydir dir;
//dir.str_exe_path = argv[0];
//printf("main path = %s\n", dir.str_exe_path.c_str());
const ACE_TCHAR options[] = ACE_TEXT("hm:p:f:");
ACE_Get_Opt cmd_opts(argc, argv, options);
int option;
while((option = cmd_opts()) != EOF)
{
switch(option)
{
case 'm':
printf("m = %s\n", cmd_opts.optarg);
break;
case 'p':
dir.str_dat_path = cmd_opts.optarg;
printf("p = %s\n", dir.str_dat_path.c_str());
break;
case 'f':
{
string str_optarg = cmd_opts.optarg;
if(str_optarg == _T("all"))
{
for(int i = R_MIF; i < UNKOWN_MIF; i++)
dir.file_type_vec.push_back(i);
}
else
{
string::size_type i_start = 0;
string::size_type i_index = 0;
while(string::npos != i_index)
{
i_index = str_optarg.find(' ', i_start);
string str_sub;
if(string::npos != i_index)
{
str_sub = str_optarg.substr(i_start, i_index - i_start);
i_start = i_index + 1;
}
else
{
str_sub = str_optarg.substr(i_start);
}
dir.file_type_vec.push_back(atoi(str_sub.c_str()));
}
}
printf("f = %s\n", cmd_opts.optarg);
}
break;
default:
printf("default:\n");
break;
}
}
dir.get_one_dir(dir.str_dat_path.c_str(), "");
for(string_vector_map::iterator it_f = dir.file_array.begin(); it_f !
= dir.file_array.end(); ++it_f)
{
string_vector str = it_f->second;
for(string_vector::iterator it_n = str.begin(); it_n != str.end(); +
+it_n)
{
string s = *it_n;
printf("File Path = %s\n", s.c_str());
}
}
return 0;
}
Reply all
Reply to author
Forward
0 new messages