作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当给定不存在带有尾部斜杠的路径作为参数时,GCC(10.0.1)和Clang(11.0.0)/ MSVC(VS 16.4.3)显示出与std::filesystem::create_directories()有关的不同行为。
更准确地说,虽然所有三个编译器确实都创建了目录,但在这种情况下,后两个返回false,从而使std::filesystem::create_directories()的返回值不明确(且违反直觉)。
具体来说,如果路径“a / b / c”中不存在文件,则以下程序
#include <filesystem>
#include <iostream>
int main() {
std::cout << std::boolalpha << std::filesystem::create_directories("a/b/c/");
}
最佳答案
我可以确认,这不是先决条件的问题,我认为海湾合作委员会是正确的,但我的猜测是,在这一点上澄清标准会有所帮助。
长期以来,使用尾随分隔符标记目录以将其与文件区分开是很常见的用法。而且我希望std::filesystem::create_directories
的实现在调用之前不存在要创建的路径,而是在调用之后存在的情况下返回true。
让我们扩展一下示例:
#include <filesystem>
#include <iostream>
#include <system_error>
int main() {
std::error_code ec;
std::cout << std::boolalpha << std::filesystem::exists("a/b/c/") << "/";
std::cout << std::filesystem::create_directories("a/b/c/", ec) << "/";
std::cout << !!ec << "/" << std::filesystem::exists("a/b/c/");
}
false/true/false/true
,它不存在,它是由
create_directories
调用创建的,没有错误,并且在此之后存在。
false/false/false/true
,所以它不存在,它告诉我们它没有创建它,但是它确实存在,没有错误,并且在调用之后我们得到了证明。
CreateDirectoryW
:
a
,
a\b
,
a\b\c
和最后
a\b\c\
,最后一个报告
ERROR_ALREADY_EXISTS
,这导致
false
返回,因为我们似乎没有做任何事情,但是我认为这是一个实现细节,功能无法发挥作用。
true
,对于ec变体
false
表示错误,但是clang通过
ec
告诉我们没有。
parent_path()
的机制,最终导致了与MSVC相同的序列,其中最后一个
::mkdir("a/b/c/")
之前是
::mkdir("a/b/c")
,因此假定它为假,它将报告为false。没有创建目录。
关于c++ - 在带有斜杠的路径上返回std::filesystem::create_directories()的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60130796/
我是一名优秀的程序员,十分优秀!