我想编写一个程序来检查目录是否存在,如果目录不存在,则创建该目录和其中的一个日志文件,但如果目录已经存在,则只需在该文件夹中创建一个新的日志文件。
如何在Linux下使用C语言实现这个功能?
我想编写一个程序来检查目录是否存在,如果目录不存在,则创建该目录和其中的一个日志文件,但如果目录已经存在,则只需在该文件夹中创建一个新的日志文件。
如何在Linux下使用C语言实现这个功能?
path
)之外,mkdir
命令需要第二个参数 mode
。 - Paul R#include <sys/stat.h>
#include <sys/types.h>
int result = mkdir("/home/me/test.txt", 0777);
mkdir()
比先进行stat()
操作更快,因为它可以节省一个系统调用。如果目录已经存在,则成功的stat()
比不成功的mkdir()
慢,因为stat()
需要执行更多工作才能完成。 - Kai Petzkevoid rek_mkdir(char *path) {
char *sep = strrchr(path, '/');
if(sep != NULL) {
*sep = 0;
rek_mkdir(path);
*sep = '/';
}
if(mkdir(path, 0777) && errno != EEXIST)
fprintf(stderr, "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);
}
mkdir
命令会返回 EEXIST
,所以我们需要对此进行测试。 - undefinedint 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。
perror()
呢?这样可以避免错误地将内容写入stdout
而不是stderr
,这是其中一个好处! - undefinedFILE * fopen_mkdir(const char *path, const char *mode)
{
char *p = strdup(path);
char *sep = strchr(p+1, '/');
while(sep != NULL)
{
*sep = '\0';
if (mkdir(p, 0755) && errno != EEXIST)
{
fprintf(stderr, "error while trying to create %s\n", p);
}
*sep = '/';
sep = strchr(sep+1, '/');
}
free(p);
return fopen(path, mode);
}
FILE *f = fopen_mkdir("/path/to/log.txt", "w");
创建的。 - undefined0777
是合适的呢?我看不出无论umask如何,都给予全局写权限的理由,我会使用0755
来代替。 - undefined