如何检查ac程序中是否存在目录,如果不存在则创建目录

Lak*_*ith 1 c linux directory segmentation-fault

类似的问题在这里

但它仅涵盖单个目录级别.例如,如果您给出/home/mypc/directory并且如果仅directory存在,则创建一个.但是,当涉及到/home/mypc/directory/directory2其中两个directorydirectory2不存在的,它给出了一个分段错误.任何人都可以建议一个合适的方法.

提前致谢.

seh*_*ehe 6

如果您不想依赖外部进程,则可以编写递归函数来创建目录层次结构:

int mkdirhier(char const* target) {
    int r = 0;

    struct stat st = {0};
    if (-1 != stat(target, &st))
        return 0; // already exists

    char* parent = strdup(target);
    if (strcmp(dirname(parent), target))
        r = mkdirhier(parent); // recurse

    if (parent)
        free(parent);

    if (!r && (r = mkdir(target, 0700)))
        perror(target);

    return r;
}
Run Code Online (Sandbox Code Playgroud)

Live On Coliru

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <errno.h>
#include <time.h>

int mkdirhier(char const* target);

int main() {
    char buf[1024];
    srand(time(NULL));

    snprintf(buf, sizeof(buf), "./tree/some%d/dir%d/sub", rand(), rand());
    mkdirhier(buf);

    snprintf(buf, sizeof(buf), "/nopermissions/tree/some%d/dir%d/sub", rand(), rand());
    return mkdirhier(buf);
}
Run Code Online (Sandbox Code Playgroud)

打印

gcc main.c; ./a.out; find .
/nopermissions: Permission denied
.
./tree
./tree/some1804649601
./tree/some1804649601/dir1553142090
./tree/some1804649601/dir1553142090/sub
./main.cpp
./a.out
./main.c
Run Code Online (Sandbox Code Playgroud)