我正在用C做一个项目,而且我坚持一件事,我需要检查是否存在directoy“/ var / log / PROJECT”,如果没有,我的程序必须创建它,应用程序将始终在超级用户上运行,这就是我正在做的事情:
struct stat st = {0};
if (stat("/var/log/project/PROJECT", &st) == -1) {
printf("im creating the folder\n");
mode_t process_mask = umask(0);
int result_code = mkdir("/var/log/project/PROJECT", 0777);
umask(process_mask);
}else{
printf("exist\n");
}
很抱歉要求“做我的功课”,但我真的卡住了......
答案 0 :(得分:1)
好吧,我会怀疑地跑。如果问题是您尝试创建的目录的父目录不存在,则解决方案是在其之前创建父目录。谢天谢地,这对于递归来说并不是非常困难。试试这个:
#include <errno.h>
#include <libgen.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int create_directory_with_parents(char const *pathname, mode_t modus) {
struct stat st;
if(stat(pathname, &st) == -1) {
// If the directory does not yet exist:
//
// Make sure the parent directory is there. dirname() gives us the name of
// the parent directory, then we call this very function recursively because
// we are, after all, in a function that makes sure directories exist.
char *path_cpy = strdup(pathname);
char *dir = dirname(path_cpy);
int err = create_directory_with_parents(dir, modus);
free(path_cpy);
// If we were able to make sure the parent directory exists,
// make the directory we really want.
if(err == 0) {
mode_t process_mask = umask(0);
int err = mkdir(pathname, modus);
umask(process_mask);
}
// err is 0 if everything went well.
return err;
} else if(!S_ISDIR(st.st_mode)) {
// If the "directory" exists but is not a directory, complain.
errno = ENOTDIR;
return -1;
}
// If the directory exists and is a directory, there's nothing to do and
// nothing to complain about.
return 0;
}
int main(void) {
if(0 != create_directory_with_parents("/var/log/project/PROJECT", 0777)) {
perror("Could not create directory or parent of directory: ");
}
}
当找到存在的第一个父目录时,递归结束;最迟是/
。
此实现的一个限制是所有父目录将具有与叶目录相同的访问权限,这可能是您想要的,也可能不是。如果这不是您想要的,则必须将递归调用中的modus
参数更改为create_directory_with_parents
。如何为可能必须创建的几个父目录层传递几个modus参数是一个设计问题,取决于你的需求究竟是什么,所以我不能给出一般答案。
答案 1 :(得分:0)
为什么不执行mkdir
命令,如果目录已经存在,只是忽略它会产生的错误?这样可以省去stat
。
您是否有理由要求文件权限为777
?如果没有,您也可以删除umask
位。