std::experimental::filesystem::copy
来自 cppreference.com
< cpp | experimental | fs
在头文件 <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) 使用 options 指定的复制选项,将文件或目录 from 复制到文件或目录 to。如果 copy_options 选项组中存在多个选项(即使在
copy_file
组中,该组与 copy
无关),则行为未定义。行为如下
- 首先,在执行任何其他操作之前,通过不超过一次调用 status(或者,如果
copy_options::skip_symlinks
或copy_options::create_symlinks
存在于 options 中,则通过调用symlink_status
)获得 from 的类型和权限。 - 如果有必要,通过不超过一次 status 或 symlink_status 调用,以相同方式获得 to 的状态。
- 如果 from 不存在,则报告错误。
- 如果 from 和 to 是由 equivalent() 确定的同一个文件,则报告错误。
- 如果 from 或 to 不是正规文件、目录或符号链接(由 is_other 确定),则报告错误。
- 如果 from 是目录,但 to 是正规文件,则报告错误。
- 如果 from 是符号链接,则
- 如果
copy_options::skip_symlink
存在于 options 中,则不执行任何操作。 - 否则,如果 to 不存在且
copy_options::copy_symlinks
存在于 options 中,则行为类似于 copy_symlink(from, to)。 - 否则,报告错误。
- 如果
- 否则,如果 from 是正规文件,则
- 如果
copy_options::directories_only
存在于 options 中,则不执行任何操作。 - 否则,如果
copy_options::create_symlinks
存在于 options 中,则创建指向 to 的符号链接。注意:from 必须是绝对路径,除非 to 在当前目录中。 - 否则,如果
copy_options::create_hard_links
存在于 options 中,则创建指向 to 的硬链接。 - 否则,如果 to 是目录,则行为类似于 copy_file(from, to/from.filename(), options)(在目录 to 中创建 from 的副本作为文件)。
- 否则,行为类似于 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 中设置时没有其他效果(设置此位的唯一目的是,如果 options 为
copy_options::none
,则防止递归复制子目录)。
- 否则不执行任何操作。
内容 |
[编辑] 参数
from | - | 源文件、目录或符号链接的路径 |
to | - | 目标文件、目录或符号链接的路径 |
ec | - | 非抛出重载中用于错误报告的输出参数 |
[编辑] 返回值
(无)
[编辑] 异常
不带 error_code& 参数的重载在底层操作系统 API 错误时抛出 filesystem_error,其构造函数以 from 作为第一个参数,以 to 作为第二个参数,并以操作系统错误代码作为错误代码参数。 std::bad_alloc 可能会在内存分配失败时抛出。带 error_code& 参数的重载将它设置为操作系统 API 错误代码(如果操作系统 API 调用失败),并在没有错误发生时执行 ec.clear()。此重载具有noexcept 规范:
noexcept
[编辑] 注释
复制目录时的默认行为是非递归复制:文件被复制,但子目录不会被复制
// Given // /dir1 contains /dir1/file1, /dir1/file2, /dir1/dir2 // and /dir1/dir2 contains /dir1/dir2/file3 // After std::experimental::filesystem::copy("/dir1", "/dir3"); // /dir3 is created (with the attributes of /dir1) // /dir1/file1 is copied to /dir3/file1 // /dir1/file2 is copied to /dir3/file2
而使用 copy_options::recursive
时,子目录及其内容也会被递归复制。
// ...but after std::experimental::filesystem::copy("/dir1", "/dir3", copy_options::recursive); // /dir3 is created (with the attributes of /dir1) // /dir1/file1 is copied to /dir3/file1 // /dir1/file2 is copied to /dir3/file2 // /dir3/dir2 is created (with the attributes of /dir1/dir2) // /dir1/dir2/file3 is copied to /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"); // copy file fs::copy("sandbox/dir", "sandbox/dir2"); // copy directory (non-recursive) // sandbox holds 2 files and 2 directories, one of which has a subdirectory // sandbox/file1.txt // sandbox/file2.txt // sandbox/dir2 // sandbox/dir // sandbox/dir/subdir fs::copy("sandbox", "sandbox/copy", fs::copy_options::recursive); // sandbox/copy holds copies of the above files and subdirectories fs::remove_all("sandbox"); }
[编辑] 另请参见
指定复制操作的语义 (枚举) | |
复制符号链接 (函数) | |
复制文件内容 (函数) |