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++ 来说是不寻常的,但结果被认为更直观,而且操作相对昂贵。
无论如何,您的实施在 .
上失败的原因似乎是它有错误。 (关于如何最轻松地获得更新版本,我没有任何特别提示。)
目前我正在尝试使用 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++ 来说是不寻常的,但结果被认为更直观,而且操作相对昂贵。
无论如何,您的实施在 .
上失败的原因似乎是它有错误。 (关于如何最轻松地获得更新版本,我没有任何特别提示。)