C++ 庫研究筆記——Linux下建立資料夾
阿新 • • 發佈:2019-01-31
查了很多,都不怎麼完成,後在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';
}
有評論:
unix 的話,下面一個語句不就足夠了嗎?
system(“mkdir -p \”lsl/foo2/bar\”“);
Linux 下 mkdir 迴圈建立目錄
標頭檔案庫:
#include <sys/stat.h>
#include <sys/types.h>
函式原型: int mkdir(const char *pathname, mode_t mode);
函式說明: mkdir()函式以mode方式建立一個以引數pathname命名的目錄,mode定義新建立目錄的許可權。
返回值: 若目錄建立成功,則返回0;否則返回-1,並將錯誤記錄到全域性變數errno中。
mode方式:
S_IRWXU 00700許可權,代表該檔案所有者擁有讀,寫和執行操作的許可權
S_IRUSR(S_IREAD) 00400許可權,代表該檔案所有者擁有可讀的許可權
S_IWUSR(S_IWRITE) 00200許可權,代表該檔案所有者擁有可寫的許可權
S_IXUSR(S_IEXEC) 00100許可權,代表該檔案所有者擁有執行的許可權
S_IRWXG 00070許可權,代表該檔案使用者組擁有讀,寫和執行操作的許可權
S_IRGRP 00040許可權,代表該檔案使用者組擁有可讀的許可權
S_IWGRP 00020許可權,代表該檔案使用者組擁有可寫的許可權
S_IXGRP 00010許可權,代表該檔案使用者組擁有執行的許可權
S_IRWXO 00007許可權,代表其他使用者擁有讀,寫和執行操作的許可權
S_IROTH 00004許可權,代表其他使用者擁有可讀的許可權
S_IWOTH 00002許可權,代表其他使用者擁有可寫的許可權
S_IXOTH 00001許可權,代表其他使用者擁有執行的許可權
Example:
int isCreate = mkdir(path,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
if( !isCreate )
printf("create path:%s\n",path);
else
printf("create path failed! error code : %s \n",isCreate,path);