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;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注