我最近开始使用C ++进行工作,遇到这种情况,当我在执行代码时必须创建目录时。当我必须创建一个文件夹时,代码运行良好,但是当我必须使用此新创建的文件夹创建另一个文件夹时,该代码将失败。
假设我在C:
中,并且想要将文件存储在C:/A/B/
中。如果必须将文件存储在{{1中, }},但是在添加另一个文件夹mkdir()
时失败。
以下是我的代码段:
C:/A/
有人可以帮助我创建此目录,在该目录中父目录中可以有任意数量的文件夹吗? (PS:我已经添加了头文件sys / stat.h,iostream和字符串)
答案 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)
,其中n
是p
中不存在的元素的数量。
答案 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")