Namespaces
Variants

std::experimental::filesystem:: copy

From cppreference.net
ヘッダー <experimental/filesystem> で定義
void copy ( const path & from, const path & to ) ;
void copy ( const path & from, const path & to, error_code & ec ) ;
(1) (filesystem 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) (filesystem TS)

ファイルとディレクトリを様々なオプションでコピーします:

1) デフォルトは、 (2) と同等であり、 copy_options::none options として使用されます。
2) ファイルまたはディレクトリを from からファイルまたはディレクトリ to へコピーします。 options で指定されたコピーオプションを使用します。 options 内のいずれかの copy_options オプショングループ( copy に関連しない copy_file グループも含む)に複数のオプションが存在する場合、動作は未定義です。

動作は以下の通りです:

  • まず最初に、他の何よりも前に、 from の型とパーミッションを、 status の呼び出しを1回以内で取得する(あるいは、 copy_options::skip_symlinks または copy_options::create_symlinks options に存在する場合は、 symlink_status の呼び出しによって取得する)。
  • 必要に応じて、 to のステータスを同じ方法で、statusまたはsymlink_statusの呼び出しを1回以内で取得する。
  • 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 へのシンボリックリンクを作成する。注: to がカレントディレクトリ内にない限り、 from は絶対パスでなければならない。
  • そうでなく、 copy_options::create_hard_links options に含まれている場合、 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 が既に存在していたか、新しく作成されたかに関わらず、 from に含まれるファイルを for ( const directory_entry & x : directory_iterator ( from ) ) によって反復処理し、各ディレクトリエントリに対して copy ( x. path ( ) , to / x. path ( ) . filename ( ) , options | unspecified ) を再帰的に呼び出す。ここで unspecified は、 options で設定された場合に他の効果を持たない特別なビットである(このビットを設定する唯一の目的は、 options copy_options::none の場合にサブディレクトリの再帰的コピーを防ぐことである)。
  • それ以外の場合は何もしません。

目次

パラメータ

from - ソースファイル、ディレクトリ、またはシンボリックリンクへのパス
to - ターゲットファイル、ディレクトリ、またはシンボリックリンクへのパス
ec - 非スローオーバーロードでのエラー報告用出力パラメータ

戻り値

(なし)

例外

The overload that does not take an 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 an 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 仕様:
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つのディレクトリがあり、そのうち1つはサブディレクトリを持つ
    // 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");
}

関連項目

コピー操作のセマンティクスを指定する
(列挙型)
シンボリックリンクをコピーする
(関数)
ファイル内容をコピーする
(関数)