名前空間
変種
操作

std::experimental::filesystem::copy

From 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) (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) デフォルト。`options`としてcopy_options::noneを使用した(2)に相当します。
2) ファイルまたはディレクトリ`from`を、`options`で指定されたコピーオプションを使用して、ファイルまたはディレクトリ`to`にコピーします。`options`に含まれるcopy_optionsのオプショングループ(`copy_file`グループであっても`copy`には関連しません)で、複数のオプションが存在する場合、動作は未定義です。

挙動は以下の通りです。

  • `options`に`copy_options::skip_symlinks`または`copy_options::create_symlinks`が存在する場合、`symlink_status`を呼び出すことにより、それ以外の場合は`status`を呼び出すことにより、`from`のタイプとパーミッションを1回以内で取得します。
  • 必要に応じて、同様に1回以内の`status`または`symlink_status`の呼び出しにより、`to`のステータスを取得します。
  • `from`が存在しない場合、エラーを報告します。
  • `equivalent()`により決定される`from`と`to`が同一のファイルである場合、エラーを報告します。
  • `is_other`により決定されるように、`from`または`to`が通常のファイル、ディレクトリ、またはシンボリックリンクでない場合、エラーを報告します。
  • `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`へのシンボリックリンクを作成します。注意:`from`は絶対パスである必要があります。ただし、`to`がカレントディレクトリにある場合は除きます。
  • それ以外の場合、`options`に`copy_options::create_hard_links`が含まれている場合、`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 - ターゲットファイル、ディレクトリ、またはシンボリックリンクへのパス
エラーコード - 例外を投げないオーバーロードでのエラー報告のための出力パラメータ

[編集] 戻り値

(なし)

[編集] 例外

`error_code&`パラメータを取らないオーバーロードは、基盤となるOS APIエラーが発生した場合に`filesystem_error`をスローします。この例外は、最初の引数として`from`、2番目の引数として`to`、エラーコード引数としてOSエラーコードとともに構築されます。メモリ割り当てに失敗した場合、`std::bad_alloc`がスローされる可能性があります。`error_code&`パラメータを取るオーバーロードは、OS API呼び出しが失敗した場合にそれをOS 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");
}

[編集] 関連項目

コピー操作のセマンティクスを指定する
(列挙型) [編集]
シンボリックリンクをコピーする
(関数) [編集]
ファイルの内容をコピーする
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)