Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查c程序中是否存在目录,如果它不是';不在那里_C_Linux_Directory_Segmentation Fault - Fatal编程技术网

如何检查c程序中是否存在目录,如果它不是';不在那里

如何检查c程序中是否存在目录,如果它不是';不在那里,c,linux,directory,segmentation-fault,C,Linux,Directory,Segmentation Fault,这里也一样 但它只涵盖单个目录级别。例如,如果您提供了/home/mypc/directory,并且如果只有目录不存在,它将创建一个。但是当涉及到/home/mypc/directory/directory2时,如果目录和目录都不存在,则会出现分段错误。有谁能建议一个合适的方法吗 提前谢谢 将路径拆分为其组件,并检查路径的每个组件。因此,对于路径/home/mypc/directory/directory2,您可以按顺序检查并可能创建路径 /home /home/mypc /home/mypc/

这里也一样

但它只涵盖单个目录级别。例如,如果您提供了
/home/mypc/directory
,并且如果只有
目录
不存在,它将创建一个。但是当涉及到
/home/mypc/directory/directory2
时,如果
目录和
目录都不存在,则会出现分段错误。有谁能建议一个合适的方法吗


提前谢谢

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

  • /home
  • /home/mypc
  • /home/mypc/directory
  • /home/mypc/directory/directory2

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

  • /home
  • /home/mypc
  • /home/mypc/directory
  • /home/mypc/directory/directory2

  • 如果要使用
    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");
    }
    
    #包括
    #包括
    #包括
    #包括
    struct stat st={0};
    if(stat(“/home/mypc/directory/directory2”,&st)=-1){
    系统(“mkdir--mode=744-p/home/mypc/directory/directory2”);
    }
    
    如果要使用
    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");
    }
    
    #包括
    #包括
    #包括
    #包括
    struct stat st={0};
    if(stat(“/home/mypc/directory/directory2”,&st)=-1){
    系统(“mkdir--mode=744-p/home/mypc/directory/directory2”);
    }
    
    如果不想依赖外部进程,可以编写递归函数来创建目录层次结构:

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

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

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

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

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

    #define fileLocation”/home/laksith/Desktop/log/lp“
    实际上我将把它作为一个宏。因此,当一个人给任何目录编辑该行时,文件应该存储在那里。
    #define fileLocation”/home/laksith/Desktop/log/lp“
    实际上,我将把它作为一个宏。因此,当一个人给任何目录编辑行时,文件应该存储在那里。那么它做什么呢。你能解释一下吗?首先,它将验证目录的状态。如果无法获得此状态,则目录不存在。因此,您调用系统来执行
    mkdir
    谁使用
    -p
    @Lucas创建完整路径,除了不存在以外,还有其他原因导致
    stat
    可能失败(例如,权限、太多符号链接、路径的一个组件不是目录等)因此,声称stat失败意味着不存在是不正确的。-1:使用
    系统
    不是一个很好的解决方案:分支进程效率低下,依赖
    路径
    ,易受攻击,无法轻松使用带有空格的文件路径…@williampersell你是对的,正如文档所描述的,那么它是做什么的呢。你能解释一下吗?首先,它将验证目录的状态。如果无法获得此状态,则目录不存在。因此,您调用系统来执行
    mkdir
    谁使用
    -p
    @Lucas创建完整路径,除了不存在以外,还有其他原因导致
    stat
    可能失败(例如,权限、太多符号链接、路径的一个组件不是目录等)因此,声称stat失败意味着不存在是不正确的。-1:使用
    系统
    不是一个很好的解决方案:分支进程效率低下,依赖
    路径
    ,易受攻击,无法轻松使用带有空格的文件路径…@williampersell正如文档所述,您是正确的。