查了很多,都不怎么完成,后在stackoverflow 上了一个失推荐不多的方案,发现是最有效的。
如创建 "ab/b/c" 这个文件夹,其中,ab文件夹不要求事先不存在(若不存在,先创建)
#pragma once #include <iostream> #include <string> #include <sys/stat.h> #include <errno.h> namespace light { int mkpath(std::string s,mode_t mode=0755) { size_t pre=0,pos; std::string dir; int mdret; if(s[s.size()-1]!='/'){ // force trailing / so we can handle everything in loop s+='/'; } while((pos=s.find_first_of('/',pre))!=std::string::npos){ dir=s.substr(0,pos++); pre=pos; if(dir.size()==0) continue; // if leading / first time is 0 length if((mdret=::mkdir(dir.c_str(),mode)) && errno!=EEXIST){ return mdret; } } return mdret; } /* * 注:使用时,light::mkdir, 易与::mkdir 混淆,固去掉了 int mkdir(std::string s,mode_t mode) { light::mkpath(s, mode); } */ }
测试代码
#include "mkpath.h" int main() { int mkdirretval; //mkdirretval=light::mkpath("foo2/bar",0755); //mkdirretval=light::mkpath("./lsl/foo2/bar"); mkdirretval=light::mkpath("lsl/foo2/bar"); std::cout << mkdirretval << '\n'; }