c/c++ 创建全局目录(linux 系统)

环境

系统: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;
}

总结

多看源码,照着写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值