c implementation of 「mkdir -p」

unix 下的 mkdir 函數只能在一個已經存在的目錄下創建一個子目錄,而常見的情況是創建一個多級目錄,就像 shell 中的 mkdir -p 一樣。看過工作中的不少實現,感覺不夠簡潔和清晰,於是找到了這個實現(鏈接:sharp2wing),應該可以了。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>

#define RWXRR (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH)

int make_path(const char *path, mode_t mode)  
{  
    char dir_name[256];  
    int  i = 0, len  = 0;  

    strcpy(dir_name, path);  
    len = strlen(dir_name);

    if(dir_name[len-1] != '/') {
        strcat(dir_name, "/");  
        len = strlen(dir_name);  
    }

    for (i = 1; i < len; i++) {  
        if(dir_name[i] == '/') {  
            dir_name[i] = 0;  
            if (access(dir_name, F_OK) != 0) {
                if(mkdir(dir_name, mode) != 0) {   
                    perror("mkdir error");   
                    return -1;   
                }  
            }
            dir_name[i] = '/';  
        }  
    }  
    return   0;  
} 

int main()
{
    mode_t set_mode = RWXRR;
    char path[] = "/path/for/test";
    int ret = make_path(path, set_mode);
    if (ret) {
        printf("mkdir %s failed\n", path);
        return -1;
    }
    printf("mkdir %s success\n", path);
    return 0;
}

發表評論

郵箱地址不會被公開。 必填項已用*標註