【问题标题】:C Programming: How to create a parent directory and insert files manually?C 编程:如何创建父目录并手动插入文件?
【发布时间】:2019-07-04 13:32:45
【问题描述】:

我的目标是在我的 C 程序中创建一个新目录。在这个目录中,我想创建 15 个简单的文本文件。我坚持的部分是如何在新创建的目录中生成 15 个文本文件。我创建了这样的新目录:

mkdir("new_dir", 0755);

但我不确定如何在其中创建一个文本文件(在同一个程序中)。对此有什么建议吗?

【问题讨论】:

  • snprintf(bigbuffer, sizeof(bigbuffer), "%s/%s", "new_dir", filename); 后跟一个合适的打开操作(fopen()open()),使用bigbuffer 作为文件名。这个主题有无穷无尽的变化。
  • 在这种情况下什么是“bigbuffer”?
  • char bigbuffer[4096]; 例如。
  • 顺便说一句,另一个选项可能是chdir("new_dir")(我希望它实际上是一个变量,而不是一个常量字符串)在mkdir()之后,然后在当前目录下创建15个文件。
  • 有趣。我会试试这个并回复你。

标签: c file directory


【解决方案1】:

我猜你是在某个 POSIX 系统上。 C11 标准(阅读n1570)不知道directoriesabstraction 由您的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 的文档。

【讨论】:

  • 另一种选择是将要创建的目录的名称作为程序的参数(就像mkdir 命令所做的那样)并尝试创建它。如果您需要代码来创建目录的路径,您可以查看How can I create a directory tree in C++/Linux — 在接受的答案中具有双语言 C 和 C++ 功能(带有测试程序)。
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2010-10-14
  • 2019-07-06
相关资源
最近更新 更多