std::filesystem::copy_file
| ヘッダー <filesystem> で定義 |
||
| bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to ); |
(1) | (C++17以降) |
| bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to, |
(2) | (C++17以降) |
| bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to, |
(3) | (C++17以降) |
| bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to, |
(4) | (C++17以降) |
copy_options::none を使用した (3,4) と同等です。- もし !filesystem::is_regular_file(from) (ソースファイルが存在しないか、または通常のファイルではないため) であれば、エラーが報告されます。
- それ以外の場合で、宛先ファイルが存在しない場合、
- from が解決するファイルの内容と属性を、to が解決するファイルにコピーします(シンボリックリンクはたどられます)。
- それ以外の場合で、宛先ファイルが既に存在する場合、
- 以下のいずれかが真であればエラーを報告します。
- to と from が filesystem::equivalent(from, to) によって決定されるように同じである場合。
- to が !filesystem::is_regular_file(to) によって決定されるように通常のファイルではない場合。
- options で filesystem::copy_file の制御オプションが設定されていない場合。
- それ以外の場合で、options に
copy_options::skip_existingが設定されている場合、何もしません。 - それ以外の場合で、options に
copy_options::overwrite_existingが設定されている場合、from が解決するファイルの内容と属性を、to が解決するファイルにコピーします。 - それ以外の場合で、options に
copy_options::update_existingが設定されている場合、from が to よりも新しい場合(filesystem::last_write_time() によって定義される)、のみファイルをコピーします。
例外を投げないオーバーロードは、エラーが発生した場合に false を返します。
目次 |
[編集] パラメータ
| from | - | ソースファイルへのパス |
| to | - | ターゲットファイルへのパス |
| エラーコード | - | 例外を投げないオーバーロードでのエラー報告のための出力パラメータ |
[編集] 戻り値
ファイルがコピーされた場合は true、そうでなければ false。
[編集] 例外
noexcept とマークされていないオーバーロードは、メモリ割り当てが失敗した場合に std::bad_alloc をスローする可能性があります。
[編集] 備考
これらの関数は、最大で1回の filesystem::status(to) の直接または間接的な呼び出しを含みます(ファイルの存在確認、および filesystem::copy_options::update_existing オプションでの最終書き込み時刻の確認に使用されます)。
ディレクトリのコピーに filesystem::copy_file を使用した場合にエラーが報告されます。ディレクトリのコピーには filesystem::copy を使用してください。
filesystem::copy_file はシンボリックリンクをたどります。シンボリックリンクをコピーするには、filesystem::copy_symlink または filesystem::copy_options::copy_symlinks を指定した filesystem::copy を使用してください。
[編集] 例
#include <filesystem> #include <fstream> #include <iostream> namespace fs = std::filesystem; int main() { fs::create_directory("sandbox"); std::ofstream("sandbox/file1.txt").put('a'); fs::copy_file("sandbox/file1.txt", "sandbox/file2.txt"); // now there are two files in sandbox: std::cout << "file1.txt holds: " << std::ifstream("sandbox/file1.txt").rdbuf() << '\n'; std::cout << "file2.txt holds: " << std::ifstream("sandbox/file2.txt").rdbuf() << '\n'; // fail to copy directory fs::create_directory("sandbox/abc"); try { fs::copy_file("sandbox/abc", "sandbox/def"); } catch (fs::filesystem_error& e) { std::cout << "Could not copy sandbox/abc: " << e.what() << '\n'; } fs::remove_all("sandbox"); }
実行結果の例
file1.txt holds: a file2.txt holds: a Could not copy sandbox/abc: copy_file: Is a directory: "sandbox/abc", "sandbox/def"
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3014 | C++17 | error_code オーバーロードは noexcept とマークされていますが、メモリを割り当てる可能性があります。 |
noexcept 削除 |
[編集] 関連項目
| (C++17) |
コピー操作のセマンティクスを指定する (列挙型) |
| (C++17) |
シンボリックリンクをコピーする (関数) |
| (C++17) |
ファイルまたはディレクトリをコピーする (関数) |