使用fopen创建所有需要的文件夹

时间:2014-01-20 14:28:37

标签: c fopen

我正在使用fopen("aaa\bbb\ccc\myfile.txt","w")来创建输出文件。但是文件夹aaabbbccc不存在。解决这个问题的最佳方法是什么?是否有任何标准方法可以让fopen创建所有需要的文件夹?

6 个答案:

答案 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>