Defined in header <filesystem> | ||
---|---|---|
void copy( const std::filesystem::path& from, const std::filesystem::path& to ); void copy( const std::filesystem::path& from, const std::filesystem::path& to, std::error_code& ec ); | (1) | (since C++17) |
void copy( const std::filesystem::path& from, const std::filesystem::path& to, std::filesystem::copy_options options ); void copy( const std::filesystem::path& from, const std::filesystem::path& to, std::filesystem::copy_options options, std::error_code& ec ); | (2) | (since C++17) |
Copies files and directories, with a variety of options.
copy_options::none
used as options
from
to file or directory to
, using the copy options indicated by options
. The behavior is undefined if there is more than one option in any of the copy_options option group present in options
(even in the copy_file
group, which is not relevant to copy
)The behavior is as follows:
from
by no more than a single call to std::filesystem::symlink_status
, if copy_options::skip_symlinks
, copy_options::copy_symlinks
, or copy_options::create_symlinks
is present in options
; std::filesystem::status
otherwise. to
, by no more than a single call to std::filesystem::symlink_status
, if copy_options::skip_symlinks
or copy_options::create_symlinks
is present in options
; std::filesystem::status
otherwise (including the case where copy_options::copy_symlinks
is present in options
). from
does not exist, reports an error. from
and to
are the same file as determined by std::filesystem::equivalent
, reports an error from
or to
is not a regular file, a directory, or a symlink, as determined by std::filesystem::is_other
, reports an error from
is a directory, but to
is a regular file, reports an error from
is a symbolic link, then copy_options::skip_symlink
is present in options
, does nothing. to
does not exist and copy_options::copy_symlinks
is present in options
, then behaves as if copy_symlink(from, to)
from
is a regular file, then copy_options::directories_only
is present in options
, does nothing copy_options::create_symlinks
is present in options
, creates a symlink to to
. Note: from
must be an absolute path unless to
is in the current directory. copy_options::create_hard_links
is present in options
, creates a hard link to to
to
is a directory, then behaves as if copy_file(from, to/from.filename(), options)
(creates a copy of from
as a file in the directory to
) copy_file(from, to, options)
(copies the file) from
is a directory and either options
has copy_options::recursive
or is copy_options::none
, to
does not exist, first executes create_directory(to, from)
(creates the new directory with a copy of the old directory's attributes) to
already existed or was just created, iterates over the files contained in from
as if by for (const std::filesystem::directory_entry& x : std::filesystem::directory_iterator(from))
and for each directory entry, recursively calls copy(x.path(), to/x.path().filename(), options | unspecified)
, where unspecified is some unspecified set of copy options. from | - | path to the source file, directory, or symlink |
to | - | path to the target file, directory, or symlink |
ec | - | out-parameter for error reporting in the non-throwing overload |
(none).
std::error_code&
parameter throws filesystem_error on underlying OS API errors, constructed with from
as the first argument, to
as the second argument, and the OS error code as the error code argument. std::bad_alloc
may be thrown if memory allocation fails. The overload taking a std::error_code&
parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear()
if no errors occur. This overload has noexcept
specification: noexcept
The default behavior when copying directories is the non-recursive copy: the files are copied, but not the subdirectories:
// Given // /dir1 contains /dir1/file1, /dir1/file2, /dir1/dir2 // and /dir1/dir2 contains /dir1/dir2/file3 // After std::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
While with copy_options::recursive
, the subdirectories are also copied, with their content, recursively.
// ...but after std::filesystem::copy("/dir1", "/dir3", std::filesystem::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 <iostream> #include <fstream> #include <filesystem> namespace fs = std::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"); }
(C++17) | specifies semantics of copy operations (enum) |
(C++17) | copies a symbolic link (function) |
(C++17) | copies file contents (function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/filesystem/copy