我正在编写一个函数来为我的应用程序复制大型二进制图像。我首先尝试通过硬链接复制它们。如果失败了,那么我会回退到正常复制它们。
我最初写的函数是为了使用
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 中提到该标志仅适用于复制。只是不明白它的“为什么”
如果您查看 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
。