在 C 语言中创建一个新目录

我想写一个程序来检查一个目录的存在; 如果这个目录不存在,那么它就会在这个目录中创建一个目录和一个日志文件,但是如果这个目录已经存在,那么它就会在这个文件夹中创建一个新的日志文件。

我如何用 C 语言在 Linux 中实现这一点呢?

251910 次浏览

查看 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);
}

You can see the manual of these functions with the man 2 stat and man 2 mkdir commands.

你可以使用 mkdir:

$man 2 mkdir

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


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

我想写一个程序,(...)创建目录和一个(...)文件内

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

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

为了获得最佳实践,建议对 模式使用整数别名。参数 模式指定新目录的文件权限。

读 + 写 + 执行: S _ IRWXU (用户) ,S _ IRWXG (组) ,S _ IRWXO (其他)

来源: https://www.gnu.org/software/libc/manual/html_node/Permission-Bits.html

如果您想知道目录是否存在,请查找 EEXIST 的 errno。