我猜你是在某个 POSIX 系统上。 C11 标准(阅读n1570)不知道directories(abstraction 由您的operating system 提供)。如果你在 Windows 上,它有一个不同的WinAPI(你应该使用CreateDirectory)
首先,您对mkdir(2) 的调用可能会失败(有多种原因,包括该目录已经存在)。很可能,您实际上想在主目录中创建目录,或者记录您在当前working directory 中创建它的文档(例如,将一些适当的和先前的cd shell 内置的负担留给您的用户)。实际上,目录路径应该在运行时作为字符串计算(可能使用snprintf(3) 或asprintf(3))。
因此,如果您想在用户的主目录中创建一个目录(请记住,~/foo/ 在通配期间由shell 扩展,请参阅glob(7)...;您需要从environ(7)),你可以编写如下代码:
char pathbuf[256];
snprintf(pathbuf, sizeof(pathbuf), "%s/new_dir", getenv("HOME"));
计算该字符串。当然,您需要处理失败(getenv(3),或snprintf)。我将这些支票留作练习。您可能希望将getenv("HOME") 的结果保留在一些automatic variable 中。
然后您需要创建目录,并检查是否失败。至少(使用perror(3) 并查看errno(3)):
if (mkdir (pathbuf, 0750)) { perror(pathbuf); exit(EXIT_FAILURE); }
顺便说一句,传递给mkdir 的模式可能不允许所有其他用户写入或访问它(如果允许,您可以有一些安全性vulnerability)。所以我更喜欢0750 而不是你的0755。
最后你需要在其中创建文件,可能在写入文件之前使用fopen(3)。所以一些代码像
int i = somenumber();
snprintf(pathbuf, sizeof(pathbuf),
"%s/new_dir/file%d.txt", getenv("HOME"), i);
FILE* f = fopen(pathbuf, "w");
if (!f) { perror(pathbuf); exit(EXIT_FAILURE); };
正如Jonathan Leffler 明智地评论的那样,还有其他方法。
我的建议是记录一些约定。您希望您的程序在当前工作目录中创建一个目录,还是在某个“绝对”路径中创建它,可能与您用户的主目录有关?如果您的程序是由某个用户启动的(不是setuid 或没有root 权限,请参阅credentials(7)),则不允许在任意位置创建目录或文件(请参阅hier(7))。
如果在 Linux 上,您最好阅读一些系统编程书籍,例如 ALP 或更新的书籍。如果您使用不同的操作系统,您应该阅读其系统 API 的文档。