在C中的文件系统中创建一个目录

时间:2015-01-04 22:12:26

标签: c directory

我正在用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");

}

很抱歉要求“做我的功课”,但我真的卡住了......

2 个答案:

答案 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位。