C语言创建文件夹和多级目录

C调用系统命令创建多级目录

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *path = "a/b/c";

    // 创建目录命令的字符串
    char mkdir_command[100];
    sprintf(mkdir_command, "mkdir %s", path);

    // 调用系统命令
    system(mkdir_command);

    return 0;
}

注意,如果是在windows下,路径要改成 "a\b\c" 要实现跨平台可以写一个更改分隔符的实现。

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
#define PATH_SEPARATOR '\\'
#else
#define PATH_SEPARATOR '/'
#endif

int main() {
    char path[100]= "a/b/c";
    for (int i = 0; path[i]; i++) {
        if (path[i] == '/') {
            path[i] = PATH_SEPARATOR;
        }
        
    }
    printf("Path: %s\n", path);

    // 创建目录命令的字符串
    char mkdir_command[100];
    sprintf(mkdir_command, "mkdir %s", path);

    // 调用系统命令
    system(mkdir_command);

    puts("End");
    return 0;
}

windows下mkdir默认就支持多级目录

linux下mkdir需要参数p支持多级目录

如果文件已存在,命令行会显示子目录或文件已存在,但这又不是错误,不会影响后面的执行,所以无需手动判断该路径是否存在。

用C创建文件夹

用C来创建文件夹不是很推荐,因为他默认不支持多级目录。而且创建文件夹一般是项目初始化的过程,对性能也没什么要求,用C来实现很繁琐。

linux下使用 <sys/stat.h> 头文件中的 mkdir() 函数来创建目录。

c 复制代码
#include <stdio.h>
#include <sys/stat.h>

int main() {
    char* dirname = "my_directory"; // 要创建的目录名称

    // 使用 mkdir() 函数创建目录
    if (mkdir(dirname, 0777) == 0) {
        printf("目录创建成功: %s\n", dirname);
    } else {
        printf("无法创建目录: %s\n", dirname);
    }

    return 0;
}

windows下使用 <direct.h> 头文件中的 _mkdir() 函数来创建目录。

c 复制代码
#include <stdio.h>
#include <direct.h>

int main() {
    char* dirname = "my_directory"; // 要创建的目录名称

    // 使用 _mkdir() 函数创建目录
    if (_mkdir(dirname) == 0) {
        printf("目录创建成功: %s\n", dirname);
    } else {
        printf("无法创建目录: %s\n", dirname);
    }

    return 0;
}

C创建多级文件夹的实现

方法一:函数递归

c 复制代码
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

// 递归创建目录
void createDirectory(const char *path) {
    struct stat st;
    // 如果目录已存在,则不执行创建操作
    if (stat(path, &st) == 0) {
        printf("Directory %s already exists.\n", path);
        return;
    }
    
    // 递归创建上一级目录
    createDirectory(dirname(path));
    
    // 创建当前目录
    int status = mkdir(path, 0700); // 0700 权限可根据需要更改
    if (status == 0) {
        printf("Directory %s created.\n", path);
    } else {
        printf("Failed to create directory %s.\n", path);
    }
}

int main() {
    // 要创建的目录路径
    const char *path = "/path/to/your/directory";
    
    // 调用函数创建目录
    createDirectory(path);
    
    return 0;
}

递归的方式总觉得对性能不太友好,另外还有2个方案。

较笨的方法是使用strtok函数以及strcat函数来逐步分割和构建路径。

取巧的方法是使用strchr获取/位置,然后逐步构建路径

方法2:strchr实现逐步构建路径

c 复制代码
#include <stdio.h>
#include <string.h>
#include <direct.h>
#include <errno.h>
int mkdirr(char *path) {
    // 接下来要以/来确定要创建的目录,所以最后必须是/结尾,否则最后这个就不会创建
    if (path[strlen(path) - 1] != '/') {
        strcat(path, "/");
    }
    // puts(path);
    char *dir = path;
    while (dir = strchr(dir, '/')) {
        // printf("Found '/' at position %ld\n", dir - path);
        *dir = '\0';
        // printf("path: %s\n", path);
        if (_mkdir(path) == 0 || errno == EEXIST) {
            printf("Directory \"%s\" created successfully or already exists.\n", path);
        }
        *dir = '/';
        dir++;
    }
}
int main() {
    char path[] = "test/1/2/3";
    mkdirr(path);
    return 0;
}

参考资料:

相关推荐
HABuo4 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
2401_8589368810 小时前
【Linux C 编程】标准 IO 详解与实战:从基础接口到文件操作实战
linux·c语言
季明洵12 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
浅念-12 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒12 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森13 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
C++ 老炮儿的技术栈14 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
wangjialelele14 小时前
Linux下的IO操作以及ext系列文件系统
linux·运维·服务器·c语言·c++·个人开发
wengqidaifeng17 小时前
数据结构(三)栈和队列(上)栈:计算机世界的“叠叠乐”
c语言·数据结构·数据库·链表
VekiSon17 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件