在 C 中创建一个新目录

Posted

技术标签:

【中文标题】在 C 中创建一个新目录【英文标题】:Creating a new directory in C 【发布时间】:2011-11-17 19:37:53 【问题描述】:

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

如何在 C 语言和 Linux 中做到这一点?

【问题讨论】:

mkdir 函数创建一个新目录,blog.tremend.ro/2008/10/06/… 可能是因为您可以通过简单的搜索***.com/search?q=C+make+directory 在 google 甚至这里找到解决方案。顺便说一句,我不是投反对票的人。 请将您的问题edit 显示the code you have so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask。 【参考方案1】:

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

【讨论】:

我相信Linux下的mkdir除了path之外还需要第二个参数mode @Uku:将错误数量的参数传递给函数是未定义行为,因此虽然它在某个情况下似乎对您有用,但您不应该依赖它。 在创建目录之前检查目录不存在的目的是什么?即使 stat 说它尚不存在,也可能在此期间由另一个进程创建。 @Brandin 我想我盲目地回答了 OP 的问题 :) 你对比赛条件的看法是正确的。 这将被大多数优秀的静态分析器标记为 TOCTOU 风险【参考方案2】:

你可以使用 mkdir:

$ man 2 mkdir

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

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

【讨论】:

这会删除并替换现有目录吗? @jjxtra:: 不,如果目录已经存在,它应该会失败,就像您从命令行尝试相同的操作一样。 这就是我猜到的。每次都跳过 stat 检查而只跳过 mkdir 有什么性能问题吗? @jjxtra:除非您创建数千个目录,否则我无法想象会有任何可衡量的性能差异。 直接尝试mkdir()而不是先尝试stat()会更快,因为如果创建了目录,它会节省一个系统调用。如果目录已经退出,那么成功的stat() 仍然会比不成功的mkdir() 慢,因为stat() 必须做更多的工作才能完成。【参考方案3】:

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

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

【讨论】:

只是我的 5 美分 - 可能不需要 dir 的模式 0777 - 也许 0755 更好,甚至通过参数传递? @ivan.ukr 0777 是正确的,模式将由用户 umask 修改。例如。对于 umask 022,结果为 755,对于 umask 007,结果为 770。【参考方案4】:

int mkdir (const char *filename, mode_t mode)

#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。

【讨论】:

以上是关于在 C 中创建一个新目录的主要内容,如果未能解决你的问题,请参考以下文章

在当前目录中创建的新文件夹

如何在 emacs 中创建一个空文件?

什么命令在终端中创建一个新文件?

在C中创建一个没有重复的新数组

如何在 Java 中创建一个新的 zip 文件并向其中添加一个大目录?

如何在指定路径中创建目录?