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

server/2024/9/24 8:37:01/

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” 要实现跨平台可以写一个更改分隔符的实现。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#ifdef _WIN32
#define PATH_SEPARATOR '\\'
#else
#define PATH_SEPARATOR '/'
#endifint 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() 函数来创建目录。

#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() 函数来创建目录。

#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创建多级文件夹的实现

方法一:函数递归

#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实现逐步构建路径

#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;
}

参考资料:

  • creating multiple recursive directories in c

http://www.ppmy.cn/server/35522.html

相关文章

数据库原理与应用实验三 嵌套查询

实验目的和要求 加深和掌握对嵌套查询的理解和应用 实验环境 Windows10 SQLServer 实验内容与过程 图书&#xff08;书号&#xff0c;书名&#xff0c;价格&#xff0c;出版社&#xff09; 读者&#xff08;卡号&#xff0c;姓名&#xff0c;年龄&#xff0c;所属单位&a…

扭矩法是什么拧紧工艺?——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 扭矩法是一种在拧紧工艺中广泛使用的预紧力控制方法。它基于扭矩与预紧力的线性关系&#xff0c;通过控制扭矩值来实现对被连接件的预紧。这种方法的优点在于操作简单&#xff0c;只需对扭矩进行控制即可。 在扭矩法拧…

浅记SpringBoot3源码中应用的JDK新特性

问题背景 在看SpringBoot3涉及到SpringMVC源码的时候&#xff0c;看到这么个东西。 // Bean name or resolved handler?if (handler instanceof String handlerName) {handler obtainApplicationContext().getBean(handlerName);}在想这是什么操作&#xff1f; 后来查到这是…

【Kafka每日一问】Kafka分区分配策略有哪些?

Kafka分区分配策略有哪些 Range分配策略&#xff08;Range&#xff09;&#xff1a; 这是默认的分配策略。在这种策略下&#xff0c;每个消费者负责订阅主题的连续范围内的分区。例如&#xff0c;如果有两个消费者和一个主题有12个分区&#xff0c;那么第一个消费者将负责分区0…

秋招后端开发面试题 - MySQL事务

目录 MySQL事务前言面试题什么是数据库事务为什么要有事务呢&#xff1f;项目中遇到的事务事务的传播机制事务的特性&#xff1f;事务并发存在的问题四大隔离级别四大隔离级别&#xff0c;都会存在哪些并发问题呢数据库是如何保证事务的隔离性的呢&#xff1f;如何解决加锁后的…

JavaScript异步编程——01-单线程和异步任务

单线程 JS 是单线程的 JavaScript 语言的执行是单线程的。即同一时间&#xff0c;只能处理一个任务。 具体来说&#xff0c;所谓单线程&#xff0c;是指 JS 引擎中负责解释和执行 JavaScript 代码的线程只有一个&#xff0c;即同一时间&#xff0c;只能处理一个任务。这个任…

GoF之工厂模式

GoF之工厂模式 文章目录 GoF之工厂模式每博一文案1. 简单说明“23种设计模式”1.2 介绍工厂模式的三种形态1.3 简单工厂模式&#xff08;静态工厂模式&#xff09;1.3.1 简单工厂模式的优缺点: 1.4 工厂方法模式1.4.1 工厂方法模式的优缺点: 1.5 抽象工厂模式1.6 抽象工厂模式的…

Linux捕获网络接口上的网络流量(抓包)

抓包示例命令&#xff1a; tcpdump -i eth0 -w /tmp/capture.pcap host 192.168.1.100 and portrange 8000-90001、tcpdump&#xff1a;这是一个用于捕获和显示网络上的数据包的网络分析工具。 2、-i eth0&#xff1a; -i&#xff1a;指定要监听的网络接口。eth0&#xff1a…