在c中创建多个递归目录

时间:2015-03-05 08:32:01

标签: c for-loop mkdir cs50

我正在完成cs50x(哈佛cs50的edX(免费)版本)课程,我正试图自己有点棘手/懒惰/测试。

我正在尝试使用C程序来创建我的pset所需的所有目录。

我在网上查了一下,发现<sys/stat.h>包含mkdir()函数,因此尝试创建一些嵌套循环,通过执行与mkdir {pset1,pset1/{standard,hacker},pset2,pset2{standard...类似的操作来创建所有必需的文件夹目录结构如下:

pset1/Standard
pset1/Hacker
pset2/Standard

等...

我想出了这个:

#include <cs50.h>
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, string argv[])
{
    for(int i = 1; i <=8; i++)
    {
        string dir = argv[1];
        sprintf(dir,"%s%i", argv[1], i);
        mkdir(dir, 0777);
        for(int j = 0; j<2; j++)
        {
            string subDir[] = {"Standard","Hacker"};
            sprintf(dir,"%s%i/%s", argv[1], i, subDir[j]);
            mkdir(dir, 0777);
        }
    }
}

但是,该程序仅创建pset1并完成,没有子文件夹,没有pset2等。

2 个答案:

答案 0 :(得分:2)

是的,你似乎很懒,因为你似乎对C知之甚少,但却尝试编程。 :)

C不是Python,没有字符串插值/格式化运算符。你必须特别调用一个函数snprintf()。阅读该手册页。

此外,只需调用mkdir(),就无法创建一堆嵌套目录。阅读the manual page

要创建嵌套目录,您要么必须构建每个绝对路径(即每次连续调用mkdir()时路径将比上一次更长),实际上在创建每个目录时输入,然后从那里开始。

答案 1 :(得分:0)

要创建完整路径,您可以像这样递归地调用mkdir()

#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

int mkdirr(const char * path, const mode_t mode, const int fail_on_exist)
{
  int result = 0;
  char * dir = NULL;

  do
  {
    if (NULL == path)
    {
      errno = EINVAL;
      result = -1;
      break;
    }

    if ((dir = strrchr(path, '/'))) 
    {
      *dir = '\0';
      result = mkdirr(path, mode, fail_on_exist);
      *dir = '/';

      if (result)
      {
        break;
      }
    }

    if (strlen(path))
    {
      if ((result = mkdir(path, mode)))
      {
        char s[PATH_MAX];
        sprintf(s, "mkdir() failed for '%s'", path);
        perror(s);

        if ((EEXIST == result) && (0 == fail_on_exist))
        {
          result = 0;
        }
        else
        {
          break;
        }
      }
    }
  } while (0);

  return result;
}

然后像这样打电话给mkdirr();

int main(void)
{
  char p[] = "test/1/2/3";
  if (-1 == mkdirr(p, 0777, 0))
  {
    perror("mkdirr() failed()");
  }

  return 0;
}