在 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 stat
和man 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 中创建一个新目录的主要内容,如果未能解决你的问题,请参考以下文章