【问题标题】:How can I check for the existence of a directory in a c program and create it if it isn't there如何检查 c 程序中是否存在目录并在不存在时创建它
【发布时间】:2015-12-06 09:33:41
【问题描述】:

类似的question在这里。

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

提前致谢。

【问题讨论】:

    标签: c linux directory segmentation-fault


    【解决方案1】:

    将路径拆分为其组件,并检查路径的每个组件。因此,对于路径/home/mypc/directory/directory2,您按顺序检查并可能创建

    1. /home
    2. /home/mypc
    3. /home/mypc/directory
    4. /home/mypc/directory/directory2

    【讨论】:

    • #define fileLocation "/home/laksith/Desktop/log/lp" 实际上我要把它作为一个宏给出。所以当一个人给任何目录编辑该行时,文件应该存储在那里。
    【解决方案2】:

    如果您要使用mkdir 创建目录,只需添加-p

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    struct stat st = {0};
    
    if (stat("/home/mypc/directory/directory2", &st) == -1) {
        system("mkdir --mode=744 -p /home/mypc/directory/directory2");
    }
    

    【讨论】:

    • 那么它有什么作用。你能解释一下吗
    • 首先它会验证目录的状态。如果无法获得此状态,则目录不存在。所以你调用系统执行mkdir,他用-p创建完整路径。
    • @Lucas,除了不存在之外,stat 可能会失败还有其他原因(例如,权限、符号链接太多、路径的组件不是目录等)所以声称统计失败意味着不存在是不正确的。
    • -1: 使用system 不是一个很好的解决方案:fork 进程效率低下,对PATH 的依赖,code injection 的漏洞,不会轻易使用文件路径空格...
    • @WilliamPursell 你是对的,正如文档描述的那样。
    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2015-10-05
      • 1970-01-01
      • 2011-05-12
      • 2012-02-23
      • 2011-01-05
      • 2012-10-23
      相关资源
      最近更新 更多