linux 在C中创建新目录

dkqlctbz  于 2023-11-17  发布在  Linux
关注(0)|答案(5)|浏览(116)

我想写一个程序来检查一个目录是否存在;如果该目录不存在,那么它会在其中创建一个目录和一个日志文件,但如果该目录已经存在,那么它只会在该文件夹中创建一个新的日志文件。
在C中如何在Linux中实现这一点?

nbewdwxp

nbewdwxp1#

查看stat以检查目录是否存在,
mkdir创建一个目录。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

if (stat("/some/directory", &st) == -1) {
    mkdir("/some/directory", 0700);
}

字符串
您可以使用man 2 statman 2 mkdir命令查看这些函数的手册。

uttx8gqw

uttx8gqw2#

你可以使用mkdir:
$ man 2 mkdir

#include <sys/stat.h>
#include <sys/types.h>

int result = mkdir("/home/me/test.txt", 0777);

字符串

owfi6suc

owfi6suc3#

我想写一个程序,(.)创建目录和(.)文件里面
因为这是一个非常常见的问题,下面是创建多层目录并调用fopen的代码。我使用gnu扩展来用printf打印错误消息。

void rek_mkdir(char *path) {
    char *sep = strrchr(path, '/');
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = '/';
    }
    if(mkdir(path, 0777) && errno != EEXIST)
        fprintf(stderr, "error while trying to create '%s'\n%m\n", path); 
}

FILE *fopen_mkdir(char *path, char *mode) {
    char *sep = strrchr(path, '/');
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}

字符串

w1e3prcc

w1e3prcc4#

第一个月

#include <sys/types.h>
#include <errno.h>
#include <string.h>

if (mkdir("/some/directory", S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
    printf("Error: %s\n", strerror(errno));
}

字符串
最好的做法是,建议使用整数别名作为mode。参数mode指定新目录的文件权限。
读+写+执行:S_IRWXU(用户)、S_IRWXG(组)、S_IRWXO(其他)
来源:https://www.gnu.org/software/libc/manual/html_node/Permission-Bits.html
如果你想知道这个目录是否存在,请查找EEXIST的errno。

yvfmudvl

yvfmudvl5#

下面是Jens Harms代码的简化版本,它不使用递归。

FILE * fopen_mkdir(const char *path, const char *mode)
{
    char *p = strdup(path);
    char *sep = strchr(p+1, '/');
    while(sep != NULL)
    {
        *sep = '\0';
        if (mkdir(p, 0755) && errno != EEXIST)
        {
            fprintf(stderr, "error while trying to create %s\n", p);
        }
        *sep = '/';
        sep = strchr(sep+1, '/');
    }
    free(p);
    return fopen(path, mode);
}

字符串

相关问题