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"); }
[編集] 関連項目
| コピー操作のセマンティクスを指定する (列挙型) | |
| シンボリックリンクをコピーする (関数) | |
| ファイルの内容をコピーする (関数) |