命名空间
变体
操作

std::filesystem::copy_file

来自 cppreference.com
 
 
 
定义在头文件 <filesystem>
bool copy_file( const std::filesystem::path& from,
                const std::filesystem::path& to );
(1) (自 C++17 起)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,

                std::error_code& ec );
(2) (自 C++17 起)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,

                std::filesystem::copy_options options );
(3) (自 C++17 起)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,
                std::filesystem::copy_options options,

                std::error_code& ec );
(4) (自 C++17 起)
1,2) 默认值,等效于 (3,4) 中使用 copy_options::none 作为 options.
3,4) 使用 options 中指示的复制选项,将单个文件从 from 复制到 to。如果 options 中存在任何 copy_options 选项组中的多个选项(即使在与 filesystem::copy_file 不相关的组中),行为未定义。
  • from 解析到的文件的内容和属性复制到 to 解析到的文件(会跟随符号链接)。
  • 否则,如果目标文件已经存在,
  • 如果以下任一情况为真,则报告错误
  • 否则,如果在 options 中设置了 copy_options::skip_existing,则不执行任何操作。
  • 否则,如果在 options 中设置了 copy_options::overwrite_existing,则将 from 解析到的文件的内容和属性复制到 to 解析到的文件。
  • 否则,如果在 options 中设置了 copy_options::update_existing,则仅当 fromto 更新时才复制文件,如 filesystem::last_write_time() 所定义。

非抛出重载如果发生错误则返回 false

内容

[编辑] 参数

from - 源文件路径
to - 目标文件路径
ec - 非抛出重载中用于错误报告的输出参数

[编辑] 返回值

如果文件已复制,则为 true,否则为 false

[编辑] 异常

任何未标记为 noexcept 的重载如果内存分配失败,可能会抛出 std::bad_alloc

1,3) 在底层操作系统 API 错误上抛出 std::filesystem::filesystem_error,使用 from 作为第一个路径参数,to 作为第二个路径参数,以及操作系统错误代码作为错误代码参数构造。
2,4) 如果操作系统 API 调用失败,则将 std::error_code& 参数设置为操作系统 API 错误代码,如果未发生错误,则执行 ec.clear()

[编辑] 注释

这些函数最多涉及一次对 filesystem::status(to) 的直接或间接调用(用于确定文件是否存在,以及对于 filesystem::copy_options::update_existing 选项,其上次写入时间)。

filesystem::copy_file 用于复制目录时会报告错误:为此使用 filesystem::copy

filesystem::copy_file 会跟随符号链接:为此使用 filesystem::copy_symlink 或带有 filesystem::copy_options::copy_symlinksfilesystem::copy

[编辑] 示例

#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file1.txt").put('a');
 
    fs::copy_file("sandbox/file1.txt", "sandbox/file2.txt");
 
    // now there are two files in sandbox:
    std::cout << "file1.txt holds: "
              << std::ifstream("sandbox/file1.txt").rdbuf() << '\n';
    std::cout << "file2.txt holds: "
              << std::ifstream("sandbox/file2.txt").rdbuf() << '\n';
 
    // fail to copy directory
    fs::create_directory("sandbox/abc");
    try
    {
        fs::copy_file("sandbox/abc", "sandbox/def");
    }
    catch (fs::filesystem_error& e)
    {
        std::cout << "Could not copy sandbox/abc: " << e.what() << '\n';
    }
    fs::remove_all("sandbox");
}

可能的输出

file1.txt holds: a
file2.txt holds: a
Could not copy sandbox/abc: copy_file: Is a directory: "sandbox/abc", "sandbox/def"

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯地应用到以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 3014 C++17 error_code 重载标记为 noexcept 但可以分配内存 noexcept 已删除

[编辑] 另请参阅

指定复制操作的语义
(枚举) [编辑]
复制符号链接
(函数) [编辑]
(C++17)
复制文件或目录
(函数) [编辑]