我正在使用fopen("aaa\bbb\ccc\myfile.txt","w")
来创建输出文件。但是文件夹aaa
,bbb
和ccc
不存在。解决这个问题的最佳方法是什么?是否有任何标准方法可以让fopen创建所有需要的文件夹?
答案 0 :(得分:1)
正如其他人所说,C标准库中的目录没有跨平台支持。
就我的理解而言,fopen()
和朋友甚至不知道或关心你给他们的路径中/
- es或\
- es是在今天使用的两个主要操作系统系列中用作目录分隔符。
有关单个目录创建的跨平台解决方案,请参阅@dbush' s answer。
然后,您可以使用自己的函数来包装它,它将获取包括所有父文件夹的完整文件/目录路径,并逐个创建所有必需的父文件夹(如果需要)。
为此,您需要设计一种从最顶层/最左侧目录开始从文件路径中提取每个连续父目录的方法。注意在C中拆分字符串,因为strtok()
之类的函数可能不安全 - 使用不同的方法将路径转换为要创建的目录列表可能会更好。
您可能还需要处理已存在目录的情况,或者您希望放置其中一个目录的路径中存在文件的情况。
答案 1 :(得分:1)
可能不像其他人那样优雅,但是:
system("mkdir aaa\\bbb\\ccc\\");
FILE * fp;
fp = fopen("aaa/bbb/ccc/myfile.txt","w");
对于linux使用-p
选项和斜杠。
编辑:如果你使用Windows
,反斜杠应该在system()
函数中
答案 2 :(得分:0)
如果你可以在你的程序中混合一些C ++,boost.filesystem库有一个非常方便的function来创建所有中间目录。
bool create_directories(const path& p);
答案 3 :(得分:0)
C标准。库。用于打开和写入文件的函数,虽然它们可以在现有目录中创建新文件,但它们无法创建新目录。为此,我建议使用头文件“sys / stat.h”中的“mkdir”函数和头文件“unistd.h”中的“chdir”函数。
例如,如果在Windows 10上编写要在Cygwin上使用的C程序,这样的东西就可以工作:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <error.h>
int main (void)
{
FILE * fp;
chdir("/cygdrive/d");
if (mkdir("aaa", S_IRWXU|S_IRWXG|S_IROTH))
{
error(EXIT_FAILURE, errno, "Failed to create directory aaa");
}
chdir("aaa");
if (mkdir("bbb", S_IRWXU|S_IRWXG|S_IROTH))
{
error(EXIT_FAILURE, errno, "Failed to create directory bbb");
}
chdir("bbb");
if (mkdir("ccc", S_IRWXU|S_IRWXG|S_IROTH))
{
error(EXIT_FAILURE, errno, "Failed to create directory ccc");
}
chdir("ccc");
fp=fopen("MyFile.txt", "w");
if (!fp)
{
error(EXIT_FAILURE, errno, "Failed to open file for writing");
}
fprintf(fp, "Test.\n");
fclose(fp);
return 0;
}
这将创建目录“D:\ aaa \ bbb \ ccc”,然后在该目录中创建一个名为“MyFile.txt”的文件,然后将“Test。\ n”写入该文件。
答案 4 :(得分:-2)
fopen()用于打开文本或二进制文件的输入流,而不是目录文件。如果你想在一个包含不存在的目录的路径中打开你的文件,我建议你使用/sys/stat.h头文件的mkdir()方法。准备好目录后,可以使用fopen()打开所需的文件(如果尚未创建则创建它)。 这是我用来在$ HOME文件夹的目录中创建文件的方法: -
char* home_dir= getenv("HOME");
/*creates the directory with specified modes*/
mkdir(strcat(home_dir, "/make-a-note/"),S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
/*used the strcat() to generate the file-path.*/
personal_work=fopen(strcat(home_dir,"personal_work.txt"),"a+");
答案 5 :(得分:-2)
如果您使用fopen()
,则应首先创建父目录。
您可以通过
完成此操作system("mkdir -p aaa/bbb/ccc");
fopen("aaa/bbb/ccc/myfile.txt","w");
请勿忘记在此程序中包含头文件<stdlib.h>