std::experimental::filesystem::copy

来自cppreference.com
< cpp‎ | experimental‎ | fs
 
 
实验性
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
实验性非 TS 功能特性
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
在标头 <experimental/filesystem> 定义
void copy( const path& from, const path& to );
void copy( const path& from, const path& to, error_code& ec );
(1) (文件系统 TS)
void copy( const path& from, const path& to, copy_options options );
void copy( const path& from, const path& to, copy_options options, error_code& ec );
(2) (文件系统 TS)

复制文件和目录,有各种选项:

1) 默认,等价于 (2) 中以 copy_options::none 用作 options
2) 赋值文件或目录 from 到文件或目录 to,使用 options 所指定的复制选项。如果 options 中给出的任何 copy_options 选项组中有多于一个选项,则其行为未定义(即使是与 copy 无关的 copy_file 组也是如此)。

行为如下:

  • 首先,在做任何别的事之前,通过不多于一次对 status 的调用(或者,当 options 中给出 copy_options::skip_symlinkscopy_options::create_symlinks 时,通过一次对 symlink_status 的调用)获取 from 的类型和权限。
  • 如果必要,以相同方式,通过不多于一次 statussymlink_status 调用,获取 to 的状态。
  • 如果 from 不存在,则报告错误。
  • 如果 fromtoequivalent() 确定为相同文件,则报告错误。
  • 如果 fromto 任一者按 is_other 确定不是常规文件、目录或符号链接,则报告错误。
  • 如果 from 是目录但 to 是常规文件,则报告错误。
  • 如果 from 是符号链接,则
  • 如果 options 中给出了 copy_options::skip_symlink,则不做任何事。
  • 否则,如果 to 不存在且 options 中给出了 copy_options::copy_symlinks,则表现如同 copy_symlink(from, to)
  • 否则,报告错误。
  • 否则,如果 from 是常规文件,则
  • 如果 options 中给出了 copy_options::directories_only,则不做任何事。
  • 否则,如果 options 中给出了 copy_options::create_symlinks,则创建到 to 的符号链接。注意:除非 to 处于当前目录,否则 from 必须为绝对路径。
  • 否则,如果 options 中给出了 copy_options::create_hard_links,则创建到 to 的硬链接。
  • 否则,如果 to 是目录,则表现如同 copy_file(from, to/from.filename(), options)(创建 from 的副本为目录 to 中的文件)。
  • 否则,表现为 copy_file(from, to, options)(复制文件)。
  • 否则,如果 from 是目录而 options 要么具有 copy_options::recursive 要么为 copy_options::none
  • 如果 to 不存在,则首先执行 create_directory(to, from)(创建新目录并带有原目录属性的副本)。
  • 然后,无论 to 已经存在还是刚刚创建,如同以 for (const directory_entry& x : directory_iterator(from))from 中包含的文件进行迭代,并对每个目录项,递归调用 copy(x.path(), to/x.path().filename(), options | unspecified),其中 unspecified 为一个特殊位,在 options 中设置时没有其他含义(设置该位的唯一目的是当 optionscopy_options::none 时避免递归复制子目录)。
  • 否则不做任何事。

参数

from - 到源文件、目录或符号链接的路径
to - 到目标文件、目录或符号链接的路径
ec - 用于无抛出重载中报告错误的输出形参

返回值

(无)

异常

不接受 error_code& 形参的重载,在发生底层 OS API 错误时抛出 filesystem_error,它以 from 为第一实参,以 to 为第二实参,并以 OS 错误码为错误码实参构造。如果内存分配失败,则可抛出 std::bad_alloc。接受 error_code& 形参的重载,当 OS API 调用失败时将之设置为 OS API 错误码,而未发生错误时执行 ec.clear()。此重载具有
noexcept 规定:  
noexcept
  

注解

复制目录时的默认行为是非递归的复制:复制文件但不复制子目录:

// 给定
// /dir1 包含 /dir1/file1, /dir1/file2, /dir1/dir2
// 而 /dir1/dir2 包含 /dir1/dir2/file3
// 调用
std::experimental::filesystem::copy("/dir1", "/dir3");
// 后,创建了 /dir3(带有 /dir1 的属性)
// /dir1/file1 被复制为 /dir3/file1
// /dir1/file2 被复制为 /dir3/file2

而使用 copy_options::recursive,则也复制子目录,以及递归地复制它们的内容。

// ...但调用
std::experimental::filesystem::copy("/dir1", "/dir3", copy_options::recursive);
// 后,/dir3 被创建(具有 /dir1 的属性)
// /dir1/file1 被复制为 /dir3/file1
// /dir1/file2 被复制为 /dir3/file2
// /dir3/dir2 被创建(具有 /dir1/dir2 的属性)
// /dir1/dir2/file3 被复制为 /dir3/dir2/file3

示例

#include <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::filesystem;
 
int main()
{
    fs::create_directories("sandbox/dir/subdir");
    std::ofstream("sandbox/file1.txt").put('a');
    fs::copy("sandbox/file1.txt", "sandbox/file2.txt"); // 复制文件
    fs::copy("sandbox/dir", "sandbox/dir2"); // 复制目录(非递归)
    // sandbox 持有 2 个文件和 2 个目录,其一有一个子目录
    // sandbox/file1.txt
    // sandbox/file2.txt
    // sandbox/dir2
    // sandbox/dir
    //    sandbox/dir/subdir
    fs::copy("sandbox", "sandbox/copy", fs::copy_options::recursive);
    // sandbox/copy 持有以上文件和子目录的副本
    fs::remove_all("sandbox");
}

参阅

指定复制操作的语义
(枚举)
复制一个符号链接
(函数)
复制文件内容
(函数)