1. 程式人生 > >C++ 庫研究筆記——Linux下建立資料夾

C++ 庫研究筆記——Linux下建立資料夾

查了很多,都不怎麼完成,後在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);