首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >create_directory()与create_directories()

create_directory()与create_directories()
EN

Stack Overflow用户
提问于 2018-05-08 07:16:47
回答 1查看 7.1K关注 0票数 5

目前,我正试图与std::filesystem合作。我正在使用MinGW-W64 GCC 7.1.0开发Windows 7 64位.由于这个编译器不支持std::filesystem,所以我必须包括实验版本和-lstdc++fs链接。

代码语言:javascript
复制
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

到我想要创建嵌套目录的时候,这是很好的。如果我使用create_directory()一次创建一个目录,那么一切都是完美的。现在,如果我使用create_directories(),如果其中一个目录已经存在,它将抛出一个filesystem_error

代码语言:javascript
复制
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版本的内容,但是我似乎找不到任何下载。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-11 18:50:26

也许你是这个意思,但请注意,你所引用的第二句话相对于TS版本来说只是改变了--并且在这个问题被问到之后又发生了变化。它引用了p已经存在且可能不是目录的情况;函数返回false以表示它什么也不做,但是在询问时它没有报告任何错误,不管p的性质如何。逻辑是,大多数操作系统没有区分这种情况,所以让应用程序开发人员来问,他们是否关心。

加进LWG问题的结果;以前的措辞的含义充其量是不清楚的,如果函数不能满足所述的后置条件,则无法解释发生了什么。没有关于“条件后失败是错误”的一般概念,而是“在没有报告错误的情况下的条件后失败在逻辑上是不可能的”。

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

无论如何,您在.上实现失败的原因似乎是因为它存在缺陷。(对于如何最容易地获得更新版本,我没有任何特别的提示。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50227995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档