std :: filesystem :: copy()和std :: filesystem :: copy_file()有什么区别?

时间:2018-08-20 00:51:49

标签: c++ g++ c++17 std-filesystem

此代码中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的未定义引用。)

2 个答案:

答案 0 :(得分:4)

使用copy_options,并且源文件是文件(而不是目录),copy将调用copy_file。如果要处理目录,符号链接或硬链接,则不是这种情况。

答案 1 :(得分:4)

是的,除非有错误或您不希望遇到的情况。

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

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

请注意,有人可以删除foo.txt并将其替换为您上次检查(例如上一行)和调用copy或{{1}之间的目录}。在实现健壮的文件系统交互时,您不应假定文件系统处于特定状态,并确保以防御性方式编写代码。为此,如果要复制一个文件,请使用copy_file。 (并始终检查错误。)