在C中创建一个新目录


96

我想编写一个检查目录是否存在的程序;如果该目录不存在,那么它将在其中创建目录和一个日志文件,但是如果该目录已经存在,则它将在该文件夹中创建一个新的日志文件。

我如何在Linux中用C做到这一点?


1
mkdir函数创建一个新目录,blog.tremend.ro
2008/

1
也许是因为您可以通过简单的搜索stackoverflow.com/search?q=C+make+directory在Google或此处找到解决方案。顺便说一句,我不是被否决的人。
fsonmezay 2011年

编辑您的问题以显示您到目前为止的代码。您应该至少包含遇到问题的代码的大纲(但最好是一个最小的可重现示例),然后我们可以尝试解决特定的问题。您还应该阅读“ 如何提问”
Toby Speight '18

Answers:


146

看看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命令查看这些功能的手册。


5
我相信除了mkdirLinux mode以外,在Linux下还需要第二个参数path
Paul R

1
@Uku:将错误数量的参数传递给函数是未定义的行为,因此,尽管在某些情况下它似乎可以为您工作,但您不应依赖它。
Paul R

3
创建目录之前检查目录不存在的目的是什么?即使stat说它还不存在,与此同时,另一个进程也可能创建了它。
布兰丁

2
@Brandin我想我盲目地回答了OP的问题:)您对比赛的状况是正确的。
Arnaud Le Blanc

4
最优秀的静态分析仪会将其标记为TOCTOU风险
kdopen

22

您可以使用mkdir:

$男人2 mkdir

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

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

这将删除并替换现有目录吗?
jjxtra

@jjxtra ::不,如果目录已经存在,它将失败,就像您从命令行尝试相同的操作一样。
Paul R

那就是我所猜到的。通过跳过统计信息检查而每次都只是mkdir有任何性能问题吗?
jjxtra

@jjxtra:除非您要创建数千个目录,否则我无法想象会有任何可测量的性能差异。
Paul R

7

我想编写一个程序(...)在其中创建目录和(...)文件

因为这是一个非常常见的问题,所以这里的代码可以创建多个级别的目录,而不是调用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)
        printf("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);
}

3
只是我的5美分-可能不需要目录0777模式-也许0755更好,甚至通过参数传递?
ivan.ukr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.