Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建目录()与创建目录()的比较_C++_Gcc_C++17_Mingw W64 - Fatal编程技术网

C++ 创建目录()与创建目录()的比较

C++ 创建目录()与创建目录()的比较,c++,gcc,c++17,mingw-w64,C++,Gcc,C++17,Mingw W64,目前我正在尝试使用std::filesystem。我正在使用MinGW-W64 GCC 7.1.0在Windows 7 64位上工作。由于此编译器不支持std::filesystem,因此我必须包含实验版本并链接到-lstdc++fs #include <experimental/filesystem> namespace fs = std::experimental::filesystem; 将版本的文档与版本进行比较,标准版本增加了一句话: 对p中尚未存在的每个元素执行(1)。

目前我正在尝试使用
std::filesystem
。我正在使用MinGW-W64 GCC 7.1.0在Windows 7 64位上工作。由于此编译器不支持
std::filesystem
,因此我必须包含实验版本并链接到
-lstdc++fs

#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
将版本的文档与版本进行比较,标准版本增加了一句话:

对p中尚未存在的每个元素执行(1)。如果p已经存在,则函数不执行任何操作(此条件不被视为错误)

为什么这首先被视为一个错误?这被认为是一个bug吗


另外,是否有一种在Windows上更新GCC的简单方法?我读了一些关于GCC 8.1.0发布和一些支持它的新的MinGW版本的文章,但我似乎找不到任何下载。

也许你的意思是这样的,但是请注意,你引用的第二句话相对于TS版本有所改变,并且在提出这个问题后又有所改变。它指的是
p
已经存在并且可能不是目录的情况;该函数返回
false
,表示它什么也没做,但在询问时,它没有报告任何错误,无论
p
的性质如何。逻辑是,大多数操作系统都不区分这种情况,因此让应用程序开发人员询问他们是否在意

它是由于一个;之前措辞的含义充其量也不清楚,没有解释如果函数未能满足其规定的后条件会发生什么。没有“后置条件失败是错误”的一般概念,而是“在没有报告错误的情况下后置条件失败在逻辑上是不可能的”

自此答案的初始版本以来,接受了一个将其更改为错误的当且仅当冲突对象不是目录时,需要在许多平台上进行后续检查。这对于C++来说是不寻常的,但是结果被认为是更直观的,而且操作相对昂贵。
无论如何,您的实现在
上失败的原因似乎是它有缺陷。(关于如何最容易地获得新版本,我没有任何特别的提示。)

“另外,有没有一种简单的方法可以在Windows上更新GCC?”-下载源代码并用当前的MinGW版本编译它们。@KorbenDose,请查看
noexcept
的位置removed@codekaizer在我看来,我正在使用的
create_目录
版本从来没有出现过
noexcept
。我可能不清楚这个错误:这个错误不是因为内存分配问题而抛出的,而是因为路径“.”已经存在。由于
create_directory
被记录为对沿途不存在的每个路径调用
create_directory
,它不应该抛出,就像
create_directory
不会抛出一样。如果boost是一个选项,我建议在正确实现std::filesystem之前坚持使用boost::filesystem。@DavisHerring Yes,你说得对。我刚刚编辑了这个问题来澄清这一点。
fs::path levelA{"."};
fs::path levelB{"folder"};
fs::path levelAB = levelA / levelB;  // "./folder"

bool create_separately; // set this bool as needed

if (create_separately) {
  /* This works perfectly */
  fs::create_directory(levelA);
  fs::create_directory(levelAB);
}
else {
  /* This throws because "." already exists */
  fs::create_directories(levelAB);
}