C++ 创建目录()与创建目录()的比较
目前我正在尝试使用C++ 创建目录()与创建目录()的比较,c++,gcc,c++17,mingw-w64,C++,Gcc,C++17,Mingw W64,目前我正在尝试使用std::filesystem。我正在使用MinGW-W64 GCC 7.1.0在Windows 7 64位上工作。由于此编译器不支持std::filesystem,因此我必须包含实验版本并链接到-lstdc++fs #include <experimental/filesystem> namespace fs = std::experimental::filesystem; 将版本的文档与版本进行比较,标准版本增加了一句话: 对p中尚未存在的每个元素执行(1)。
std::filesystem
。我正在使用MinGW-W64 GCC 7.1.0在Windows 7 64位上工作。由于此编译器不支持std::filesystem
,因此我必须包含实验版本并链接到-lstdc++fs
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
将版本的文档与版本进行比较,标准版本增加了一句话:
对p中尚未存在的每个元素执行(1)。如果p已经存在,则函数不执行任何操作(此条件不被视为错误)
为什么这首先被视为一个错误?这被认为是一个bug吗
另外,是否有一种在Windows上更新GCC的简单方法?我读了一些关于GCC 8.1.0发布和一些支持它的新的MinGW版本的文章,但我似乎找不到任何下载。也许你的意思是这样的,但是请注意,你引用的第二句话相对于TS版本有所改变,并且在提出这个问题后又有所改变。它指的是
p
已经存在并且可能不是目录的情况;该函数返回false
,表示它什么也没做,但在询问时,它没有报告任何错误,无论p
的性质如何。逻辑是,大多数操作系统都不区分这种情况,因此让应用程序开发人员询问他们是否在意
它是由于一个;之前措辞的含义充其量也不清楚,没有解释如果函数未能满足其规定的后条件会发生什么。没有“后置条件失败是错误”的一般概念,而是“在没有报告错误的情况下后置条件失败在逻辑上是不可能的”
自此答案的初始版本以来,接受了一个将其更改为错误的当且仅当冲突对象不是目录时,需要在许多平台上进行后续检查。这对于C++来说是不寻常的,但是结果被认为是更直观的,而且操作相对昂贵。
无论如何,您的实现在
上失败的原因似乎是它有缺陷。(关于如何最容易地获得新版本,我没有任何特别的提示。)“另外,有没有一种简单的方法可以在Windows上更新GCC?”-下载源代码并用当前的MinGW版本编译它们。@KorbenDose,请查看noexcept
的位置removed@codekaizer在我看来,我正在使用的create_目录
版本从来没有出现过noexcept
。我可能不清楚这个错误:这个错误不是因为内存分配问题而抛出的,而是因为路径“.”已经存在。由于create_directory
被记录为对沿途不存在的每个路径调用create_directory
,它不应该抛出,就像create_directory
不会抛出一样。如果boost是一个选项,我建议在正确实现std::filesystem之前坚持使用boost::filesystem。@DavisHerring Yes,你说得对。我刚刚编辑了这个问题来澄清这一点。
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);
}