5

这段代码std::filesystem::copy()和有什么区别?std::filesystem::copy_file()

#include <filesystem>

void testing()
{
    const std::filesystem::path src = "foo.txt";
    const std::filesystem::path dst = "bar.txt";

    std::filesystem::copy(     src, dst, std::filesystem::copy_options::overwrite_existing);
    std::filesystem::copy_file(src, dst, std::filesystem::copy_options::overwrite_existing);
}

文档说:

  • copy(): "复制文件或目录"
  • copy_file(): "复制文件内容"

由于我在此示例中复制的是单个文件而不是目录,因此这两个调用是否相同?

(我使用的是 g++ 8.2.0。记得链接到 libstdc++fs 否则你会有未定义的对 std::filesystem 的引用。)

4

2 回答 2

7

是的,除非出现错误或您不期望的情况。

如果src被一个目录默默地替换,它们的行为会有所不同。如果dst存在并且是一个目录,我相信它们的行为会有所不同。一些复制选项可能适用于 copy 而不适用于 copy_file。

但是当从一个文件复制到另一个文件或复制到一个文件不存在的名称时,copy调用copy_file.

但是请注意,有人可以foo.txt在您上次检查(比如上一行)和调用copyor之间删除并用目录替换它copy_file。在实现健壮的文件系统交互时,您不应假设文件系统处于特定状态,并确保您的代码是防御性编写的。为此,如果您打算复制一个文件,请使用copy_file. (并且总是检查错误。)

于 2018-08-20T01:03:18.090 回答
4

随着copy_options您正在使用,并且源文件是文件(而不是目录),copy将调用copy_file. 如果您正在处理目录、符号链接或硬链接,则情况并非如此。

于 2018-08-20T01:01:57.550 回答