在阅读了具有该名称的Unix系统调用的mkdir(2)手册页之后,该调用似乎没有在路径中创建中间目录,只在路径中创建了最后一个目录.有没有办法(或其他函数)创建路径中的所有目录,而无需手动解析我的目录字符串并单独创建每个目录?

推荐答案

不幸的是,没有系统调用来为您执行此操作.我猜这是因为没有一种方法可以为错误情况下应该发生的事情定义真正明确的语义.它应该保留已经创建的目录吗?删除它们?如果删除失败怎么办?等等

然而,你很容易推出自己的产品,快速搜索"recursive mkdir"找到了许多解决方案.下面是一个接近顶部的:

http://nion.modprobe.de/blog/archives/357-Recursive-directory-creation.html

static void _mkdir(const char *dir) {
    char tmp[256];
    char *p = NULL;
    size_t len;

    snprintf(tmp, sizeof(tmp),"%s",dir);
    len = strlen(tmp);
    if (tmp[len - 1] == '/')
        tmp[len - 1] = 0;
    for (p = tmp + 1; *p; p++)
        if (*p == '/') {
            *p = 0;
            mkdir(tmp, S_IRWXU);
            *p = '/';
        }
    mkdir(tmp, S_IRWXU);
}

C++相关问答推荐

你能用自己的地址声明一个C指针吗?

可以将C变量限制为特定的读/写速度吗?

为什么STM32G474RE上没有启用RCC PLL

C++中矢量类型定义和数据保护的高效解决方案

当输入负数时,排序算法存在问题

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

什么是.c.h文件?

编译器如何处理具有更复杂值的枚举?

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

C代码可以在在线编译器上运行,但不能在Leetcode上运行

如何在c中使用具有不同变量类型的内存分配?

如何对现有的双向循环链表进行排序?

C++中PUTS函数的返回值

为什么我的旧式&q;函数在传递浮点数时会打印2?

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

RISC-V GCC编译器错误编译ASM代码

将char*数组深度复制到 struct 中?

这些表达式是否涉及 C 中定义的复合文字?

malloc 属性不带参数

仅使用其内存地址取消引用 C 中的 struct