create_directory() 与 create_directories()

create_directory() vs. create_directories()

目前我正在尝试使用 std::filesystem。我正在使用 MinGW-W64 GCC 7.1.0 开发 Windows 7 64 位。由于此编译器不支持 std::filesystem,因此我必须将实验版本和 link 包含在 -lstdc++fs.

#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

在我想要创建嵌套目录之前,它工作得很好。如果我使用 create_directory() 一次创建一个目录,一切都会完美无缺。现在,如果我改用 create_directories(),如果其中一个目录已经存在,它会抛出一个 filesystem_error

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);
}

对比experimental version to the standard版的文档,标准版多了一句:

Executes (1) for every element of p that does not already exist. If p already exists, the function does nothing (this condition is not treated as an error).

为什么一开始就将其视为错误?这被认为是错误吗?

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

也许你是这个意思,但请注意,只有你引用的第二句话相对于 TS 版本发生了变化——并且自从提出这个问题后又发生了变化。它指的是 p 已经存在并且可能不是 目录 的情况;函数 returns false 表明它什么也没做,但在询问时它没有报告任何 错误 ,无论 [= 的性质如何10=]。逻辑是大多数操作系统不区分这种情况,所以留给应用程序开发人员询问,他们是否关心。

was added as a result of an LWG issue;前面措辞的含义充其量是不清楚的,没有解释如果函数未能满足其规定的后置条件会发生什么。没有“后置条件失败是错误”的一般概念,而是“没有报告错误的后置条件失败在逻辑上是不可能的”。

从这个答案的初始版本开始,paper 被接受,当且仅当冲突对象不是目录时才将其更改为错误,需要在许多平台上进行后续检查。这对于 C++ 来说是不寻常的,但结果被认为更直观,而且操作相对昂贵。

无论如何,您的实施在 . 上失败的原因似乎是它有错误。 (关于如何最轻松地获得更新版本,我没有任何特别提示。)