环境
系统:linux
系统函数调用
使用的是<sys/stat.h> 里面的 mkdir() 函数。
mkdri缺点是,如果输入为多级目录且存在上一级目录不存在的情况,则创建目录失败。举例:创建一个全局路径为 /A/B/C/D/ 的目录,如果A、B、C中有一层目录不存在,则创建此路径失败。
策略
根据mkdir函数的特点,我们的策略是将全局路径里的各级目录拆分开来,一层一层的创建。
代码
通过mkdir创建全局路径的函数是我在分析log4cplus源码时候学习的,源码里面有很多logcplus的封装所以看起来会比较繁琐,这里拆解成原生的类比如std::string类,更加具有通用性。
//定义一个结构体,代表 linux里目录分层符号 ‘/’,再后面std::find_if 查找符号的函数中会用到
struct pathseperator
{
pathseperator ()
{ }
bool
operator () (char ch) const
{
return ch == '/';
}
};
//检查路径是否已创建
int checkFolderExist(std::string const & name)
{
struct stat fileStatus;
if (stat (name.c_str (), &fileStatus) == -1)
return -1;
return 0;
}
int main(int argc, char** argv)
{
std::string sep = "/";
//第一个参数为需要创建的全路径
std::string target = std::string(argv[1]);
//通过查找 / 的方式将每层路径拆开
std::vector<mystring> container;
std::string::const_iterator const end = target.end ();
std::string::const_iterator it = target.begin ();
//char psc = '/';
pathseperator pathsep = pathseperator ();
while (it != end)
{
std::string::const_iterator sep = std::find_if (it, end, pathsep);
container.push_back (std::string (it, sep));
it = sep;
if (it != end)
++it;
}
//将拆解的路径重新一层一层的拼接,并调用系统函数mkdir创建
std::string path;
for(int i=1; i<container.size(); i++) {
path += sep;
path += container[i];
if(checkFolderExist(path) == 0) {
std::cout << "the path " << path << " already exist" << std::endl;
continue;
}
int res = mkdir(path.c_str (), 0777);
std::cout << "the result of making directory" << path << " is" << res << std::endl;
std::cout << " the index is " << container[i] << std::endl;
}
return 0;
}
总结
多看源码,照着写