create_directory()与create_directories()

时间:2018-05-08 07:16:47

标签: c++ gcc c++17 mingw-w64

目前我正在尝试使用std::filesystem。我正在使用MinGW-W64 GCC 7.1.0开发64位Windows 7。由于此编译器不支持std::filesystem,因此我必须包含实验版本并与-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版本的文档与standard版本进行比较,为标准版本添加了另一个句子:

  

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

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

另外,有一种简单的方法可以在Windows上更新GCC吗?我读了一些关于GCC 8.1.0正在发布的内容和一些支持它的新MinGW版本,但我似乎无法找到任何下载。

1 个答案:

答案 0 :(得分:0)

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

was added的结果LWG issue;之前措辞的含义充其量不清楚,如果该功能未能满足其规定的后置条件,则无法解释所发生的情况。没有一般概念“后置条件失败是一个错误”,而是“没有报告错误的后置条件失败在逻辑上是不可能的”。

因此.实施失败的原因似乎是它的错误。 (我没有任何关于如何最容易获得新版本的特别提示。)