在C ++中创建文件夹

时间:2018-06-21 04:39:34

标签: c++ c++11 filesystems

我最近开始使用C ++进行工作,遇到这种情况,当我在执行代码时必须创建目录时。当我必须创建一个文件夹时,代码运行良好,但是当我必须使用此新创建的文件夹创建另一个文件夹时,该代码将失败。

假设我在C:中,并且想要将文件存储在C:/A/B/中。如果必须将文件存储在{{1中, }},但是在添加另一个文件夹mkdir()时失败。

以下是我的代码段:

C:/A/

有人可以帮助我创建此目录,在该目录中父目录中可以有任意数量的文件夹吗? (PS:我已经添加了头文件sys / stat.h,iostream和字符串)

4 个答案:

答案 0 :(得分:2)

mkdir()仅创建指定路径的最后一个部分。在您的示例中,它将仅创建B。如果不存在任何父目录(即,如果A不存在),则函数失败,并显示ENOENT。您需要拆分路径,并为路径中的每个中间目录调用mkdir(),同时忽略EEXIST错误。

status = mkdir("C:/A/", 0777);
if ((status < 0) && (errno != EEXIST)) ...

status = mkdir("C:/A/B/", 0777);
if ((status < 0) && (errno != EEXIST)) ...

如果您不想手动处理此问题,请使用为您处理的包装器,例如Boost的create_directories()函数:

  

bool create_directories(const path& p);
  bool create_directories(const path& p, system::error_code& ec);

     

效果:通过调用create_directory()中任何不存在的元素p建立后置条件。

     

后置条件:is_directory(p)

     

返回:如果创建了新目录,则为true,否则为false。

     

抛出:错误报告中指定。

     

复杂度:O(n+1),其中np中不存在的元素的数量。

答案 1 :(得分:0)

您可以拨打以下电话:

string stringpath = "C:/A/B/";
int status = mkdir(stringpath.c_str(),0777);

如果 C:/ A /目录存在。如果不存在,请执行以下操作:

string stringpath = "C:/A/";
int status = mkdir(stringpath.c_str(),0777);
stringpath = "C:/A/B/";
int status = mkdir(stringpath.c_str(),0777);

答案 2 :(得分:0)

在C ++ 11中,您可以使用实验功能:

#include <experimental/filesystem>
...
std::stringstream bufH;
bufH << dirName << fName;
if (!std::experimental::filesystem::exists(bufH.str()))
{
 std::experimental::filesystem::create_directories(bufH.str());
}

答案 3 :(得分:0)

这是在C ++ 17中执行的操作:

#include <filesystem>
namespace fs = std::filesystem;
fs::create_directories("./a/b/c")