Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::experi...system::copy(3) C++ Standard Libarystd::experi...system::copy(3)

NAME
       std::experimental::filesystem::copy    -	   std::experimental::filesys-
       tem::copy

Synopsis
	  Defined in header <experimental/filesystem>
	  void copy( const path& from, const path& to );		   (1)
       (filesystem TS)
	  void copy( const path& from, const path& to, error_code& ec );
	  void copy( const path& from, const path& to, copy_options
	  options );							   (2)
       (filesystem TS)
	  void copy( const path& from, const path& to, copy_options
	  options, error_code& ec );

	  Copies files and directories,	with a variety of options

	  1) The default, equivalent to	(2) with  copy_options::none  used  as
       options
	  2)  Copies the file or directory 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:

	    *  First, before doing anything else, obtains type and permissions
       of from by no
	      more than	single call to status (or, if  copy_options::skip_sym-
       links or
	      copy_options::create_symlinks  are present in options, by	a call
       to
	      symlink_status).
	    * If necessary, obtains the	status of to the same way, by no  more
       than a single
	      status or	symlink_status call.
	    * If from does not exist, reports an error.
	    *  If from and to are the same file	as determined by equivalent(),
       reports an error
	    * If either	from or	to is not a regular file, a  directory,	 or  a
       symlink,	as
	      determined by is_other, reports an error
	    * If from is a directory, but to is	a regular file,	reports	an er-
       ror
	    * If from is a symbolic link, then

		     *	If  copy_options::skip_symlink	is present in options,
       does nothing.
		     *	Otherwise,  if	to  does  not	exist	and   copy_op-
       tions::copy_symlinks is
		       present	in  options,  then  behaves  as	 if  copy_sym-
       link(from, to)
		     * Otherwise, reports an error

	    * Otherwise, if from is a regular file, then

		     * If copy_options::directories_only  is  present  in  op-
       tions, does nothing
		     *	Otherwise, if 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.
		     *	Otherwise,   if	  copy_options::create_hard_links   is
       present in options,
		       creates a hard link to to
		     *	Otherwise,  if	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)
		     * Otherwise, behaves as if	copy_file(from,	 to,  options)
       (copies the file)

	    *  Otherwise,  if  from  is	 a  directory  and  either options has
       copy_options::recursive
	      or is copy_options::none,

		     * If to does  not	exist,	first  executes	 create_direc-
       tory(to,	from)
		       (creates	 the  new directory with a copy	of the old di-
       rectory's
		       attributes)
		     * Then, whether to	already	existed	or was	just  created,
       iterates	over the
		       files  contained	 in  from  as  if by for (const	direc-
       tory_entry& x :
		       directory_iterator(from)) and for each directory	entry,
       recursively
		       calls copy(x.path(), to/x.path().filename(), options  |
       unspecified),
		       where  unspecified  is  a special bit that has no other
       effect when set in
		       options.	(The sole purpose of setting this  bit	is  to
       prevent recursive
		       copying	 subdirectories	  if   options	 is   copy_op-
       tions::none.)

	    * Otherwise	does nothing

Parameters
	  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	 over-
       load

Return value
	  (none)

Exceptions
	  The  overload	 that  does  not  take	a error_code& parameter	throws
       filesystem_error	on
	  underlying OS	API errors, constructed	with from as the  first	 argu-
       ment, 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  er-
       ror_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

Notes
	  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::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

	  While	 with  copy_options::recursive,	 the  subdirectories  are also
       copied, with their
	  content, recursively.

	// ...but after
	std::experimental::filesystem::copy("/dir1",	 "/dir3",     copy_op-
       tions::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

Example
       // Run this code

	#include <iostream>
	#include <fstream>
	#include <experimental/filesystem>
	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");
	}

See also
	  copy_options specifies semantics of copy operations
		       (enum)
	  copy_symlink copies a	symbolic link
		       (function)
	  copy_file    copies file contents
		       (function)

http://cppreference.com		  2022.07.31	 std::experi...system::copy(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::experimental::filesystem::copy&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help