c - 我如何检查c程序中的目录是否存在并在不存在时创建它

标签 c linux directory segmentation-fault

相似question在这里。

但它只涵盖单个目录级别。例如,如果你给了 /home/mypc/directory 并且如果只有 directory 不存在,它会创建一个。但是当涉及到 /home/mypc/directory/directory2directorydirectory2 都不存在,它给出了一个段错误.谁能为此建议合适的方法。

提前致谢。

最佳答案

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

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

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

打印

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

关于c - 我如何检查c程序中的目录是否存在并在不存在时创建它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496081/

相关文章:

c - 如何将系统符号传递给 char*

c - 如何从正在运行的内核模块确定 linux 内核是 32 位还是 64 位

python - 使用文件夹名称重命名文件夹中的所有图像

c - 如何获取自己的进程名称

linux - 比较物理硬件和基于 kvm 的虚拟机经历了奇怪的 rdtsc 行为

python - 根据文件名创建目录

c - 扫描目录并修改c中的文件

c - C中的寻路算法

c - 如何通过 GO 中的编码包打包 C 位字段结构?

c - linux启动时间和停止计时器不工作?