gpt4 book ai didi

c++ - 在带有斜杠的路径上返回std::filesystem::create_directories()的值

转载 作者:行者123 更新时间:2023-12-02 10:36:22 25 4
gpt4 key购买 nike

当给定不存在带有尾部斜杠的路径作为参数时,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/");
}

在该路径下创建目录,但在Clang / MSVC下显示false,在GCC下显示true。

哪个是正确的行为?

最佳答案

我可以确认,这不是先决条件的问题,我认为海湾合作委员会是正确的,但我的猜测是,在这一点上澄清标准会有所帮助。

长期以来,使用尾随分隔符标记目录以将其与文件区分开是很常见的用法。而且我希望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/");
}

现在我们可以使用Godbolt: https://godbolt.org/z/5883uY

它按照我们期望的那样显示了GCC / libstdc++的 false/true/false/true,它不存在,它是由 create_directories调用创建的,没有错误,并且在此之后存在。

现在clang / libc++生成 false/false/false/true,所以它不存在,它告诉我们它没有创建它,但是它确实存在,没有错误,并且在调用之后我们得到了证明。

看看MSVC STL的github版本,看起来它用以下形式调用 CreateDirectoryW: aa\ba\b\c和最后 a\b\c\,最后一个报告 ERROR_ALREADY_EXISTS,这导致 false返回,因为我们似乎没有做任何事情,但是我认为这是一个实现细节,功能无法发挥作用。
我的猜测是,Clang代码的工作原理类似,但是我还没有检查libc++源代码。

并且标准显示为:“返回:如果创建了新目录,则为true,否则为false。如果发生错误,则带有参数ec的签名将返回false。”

因此,如果要创建目录,而不是最后一个目录,则标准希望使用 true,对于ec变体 false表示错误,但是clang通过 ec告诉我们没有。

我可能仍然是错的,因为我不在任何工作组中,但是我的结论是:GCC是正确的,并且似乎像MSVC和Clang中的错误。

在验证自己的实现的同时,我已经在实现之间收集了 discrepancies,如果可以的话,我会“愉快地”将其添加到我的集合中。

更新:我只是挖掘了其他资源,Clang / libc++使用了基于递归 parent_path()的机制,最终导致了与MSVC相同的序列,其中最后一个 ::mkdir("a/b/c/")之前是 ::mkdir("a/b/c"),因此假定它为假,它将报告为false。没有创建目录。

关于c++ - 在带有斜杠的路径上返回std::filesystem::create_directories()的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60130796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com