目前,我正试图与std::filesystem合作。我正在使用MinGW-W64 GCC 7.1.0开发Windows 7 64位.由于这个编译器不支持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);
}将实验性版本的文档与标准版本进行比较,为标准版本添加了一个额外的句子:
对不存在的p的每个元素执行(1)。如果p已经存在,则函数什么也不做(此条件不被视为错误)。
为什么从一开始就把它当作一个错误对待?这被认为是个虫子吗?
另外,在Windows上更新GCC有什么简单的方法吗?我读到了一些关于GCC 8.1.0正在发布和一些支持它的新MinGW版本的内容,但是我似乎找不到任何下载。
发布于 2018-05-11 18:50:26
也许你是这个意思,但请注意,你所引用的第二句话相对于TS版本来说只是改变了--并且在这个问题被问到之后又发生了变化。它引用了p已经存在且可能不是目录的情况;函数返回false以表示它什么也不做,但是在询问时它没有报告任何错误,不管p的性质如何。逻辑是,大多数操作系统没有区分这种情况,所以让应用程序开发人员来问,他们是否关心。
加进是LWG问题的结果;以前的措辞的含义充其量是不清楚的,如果函数不能满足所述的后置条件,则无法解释发生了什么。没有关于“条件后失败是错误”的一般概念,而是“在没有报告错误的情况下的条件后失败在逻辑上是不可能的”。
由于这个答案的初始版本,接受了一个纸,它将其更改为错误当且仅当冲突对象不是目录,需要在许多平台上进行后续检查。这对于C++来说是不寻常的,但结果被认为是更直观的,而且操作也相对昂贵。
无论如何,您在.上实现失败的原因似乎是因为它存在缺陷。(对于如何最容易地获得更新版本,我没有任何特别的提示。)
https://stackoverflow.com/questions/50227995
复制相似问题