为什么 std::filesystem_copy_file 忽略 create_hard_links 选项标志?

问题描述 投票:0回答:1

我正在编写一个函数来为我的应用程序复制大型二进制图像。我首先尝试通过硬链接复制它们。如果失败了,那么我会回退到正常复制它们。

我最初写的函数是为了使用

filesystem::copy_file
,像这样:

public bool CopyLargeStaticFile(const path& source, const path& dest)
{
    // First try a hard-link.

    std::error_code ec;
    copy_file(source, dest, copy_options::create_hard_links, ec);


    if (ec)
    {
        // On error, fall-back to a regular copy.  When copying to a different
        // disk, I would expect this error but it does not happen because copy_file
        // ignores the 'create_hard_links' flag and just makes a regular copy

        ec.clear();
        copy_file(source, dest, ec);
    }

    return !ec;
}

但后来我发现当你调用

create_hard_link
时,
copy_file
标志不被尊重。如果你想让它得到尊重,你必须改为调用
filesystem::copy
.

有人知道为什么吗?有什么技术原因吗?这是对文件系统规范的监督吗? Visual Studio 实现有问题吗?这对我来说毫无意义。

编辑添加:在我发现这一点之后,我确实在 copy_options enum 中提到该标志仅适用于复制。只是不明白它的“为什么”

c++ visual-studio c++17 c++-standard-library
1个回答
1
投票

如果您查看 copy_options 的 C++ 标准,您会发现

create_hard_links
旨在仅影响
copy()
而不是
copy_file()
。如果您查看 Microsoft 的 implementation
copy_file()
,您会发现它只查看
copy_options
的部分,这些部分是“如何处理现有文件”逻辑的一部分。

所以对你来说不幸的是,Microsoft 的 STL 遵循这里的标准,而你试图做的根本行不通。

从技术上讲,你甚至在这里绕过未定义的行为:

如果选项中存在的任何 copy_options 选项组中有多个选项(即使在与 filesystem::copy_file 无关的组中),则行为未定义

因为你只指定了

create_hard_links
从技术上讲你仍然没有调用 UB(无论如何微软的实现在这里都会很宽松),但它根本不会有任何效果。

我不确定,但我的猜测是这里的推理是

copy_file
旨在明确复制文件的内容(而不关心花哨的文件系统功能),而
copy
是一个更高的级例程。 (标准本身说
copy
在某些情况下可能会调用
copy_file
。)

因此,如果您想要硬链接,只需使用

copy

© www.soinside.com 2019 - 2024. All rights reserved.