std::filesystem::copy_file
ヘッダ <filesystem> で定義 | ||
bool copy_file(conststd::filesystem::path& from, conststd::filesystem::path& to ); | (1) | (C++17以上) |
bool copy_file(conststd::filesystem::path& from, conststd::filesystem::path& to, | (2) | (C++17以上) |
options
として copy_options::none
を指定した (2) と同等です。options
で表されるコピーオプションを使用して、単一のファイルを from
から to
にコピーします。 copy_options の任意のオプショングループ (copy_file
に関係のないグループであっても) の2つ以上のオプションが options
に存在する場合、動作は未定義です。 - !is_regular_file(from) であれば (コピー元ファイルが存在しないか、普通のファイルでない)、エラーが報告されます。
- そうでなく、コピー先ファイルが存在しなければ、
from
の解決先のファイルの内容と属性がto
の解決先のファイルにコピーされます (シンボリックリンクを辿ります)。
- そうでなく、コピー先ファイルがすでに存在している場合、
- 以下のいずれかが真であれば、エラーが報告されます。
to
とfrom
が同じファイルである。 equivalent(from, to) によって判断されます。to
が普通のファイルでない。 !is_regular_file(to) によって判断されます。copy_file
制御オプションがいずれもoptions
に設定されていない。
- そうでなく、
options
にcopy_options::skip_existing
が設定されていれば、何もしません。 - そうでなく、
options
にcopy_options::overwrite_existing
が設定されていれば、from
の解決先のファイルの内容と属性がto
の解決先のファイルにコピーされます。 - そうでなく、
options
にcopy_options::update_existing
が設定されていれば、from
がto
よりも新しい場合にのみ、ファイルがコピーされます。 新しさは last_write_time() によって定義されます。
例外を投げないオーバーロードは、エラーが発生した場合、 false を返します。
目次 |
[編集]引数
from | - | コピー元のファイルを指すパス |
to | - | コピー先のファイルを指すパス |
ec | - | 例外を投げないオーバーロードでエラーを報告するための出力引数 |
[編集]戻り値
ファイルがコピーされた場合は true、そうでなければ false。
[編集]例外
std::error_code& 引数を取らないオーバーロードは、ベースとなる OS の API でエラーが発生した場合、第1パス引数に from
、第2パス引数に to
、エラーコード引数に OS のエラーコードを指定して構築された filesystem_error を投げます。 std::error_code& 引数を取るオーバーロードは、 OS の API 呼び出しが失敗した場合、その引数を OS の API のエラーコードに設定し、エラーが発生しない場合は ec.clear() を実行します。 noexcept
指定のないあらゆるオーバーロードは、メモリ確保に失敗した場合 std::bad_alloc を投げる可能性があります。
[編集]ノート
この関数は (ファイルの存在確認と、 copy_options::update_existing
オプション用に最終更新時刻を取得するために)、 status(to) を直接または間接的に高々1回呼びます。
ディレクトリをコピーするために copy_file
を使用すると、エラーが報告されます。 そのためには copy を使用してください。
copy_file
はシンボリックリンクを辿ります。 そのためには copy_options::copy_symlinks
オプションを指定して copy_symlink または copy を使用してください。
[編集]欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
DR | 適用先 | 発行時の動作 | 正しい動作 |
---|---|---|---|
LWG 3014 | C++17 | error_code overload marked noexcept but can allocate memory | noexcept removed |
[編集]例
#include <fstream>#include <iostream>#include <filesystem>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++17) | コピー操作のセマンティクスを指定します (列挙) |
(C++17) | シンボリックリンクをコピーします (関数) |
(C++17) | ファイルまたはディレクトリをコピーします (関数) |