我正在完成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
等。
答案 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;
}