名前空間
変種
操作

std::filesystem::copy_file

提供: cppreference.com
 
 
 
ヘッダ <filesystem> で定義
bool copy_file(conststd::filesystem::path& from,

                conststd::filesystem::path& to );
bool copy_file(conststd::filesystem::path& from,
                conststd::filesystem::path& to,

                std::error_code& ec );
(1) (C++17以上)
bool copy_file(conststd::filesystem::path& from,

                conststd::filesystem::path& to,
                std::filesystem::copy_options options );
bool copy_file(conststd::filesystem::path& from,
                conststd::filesystem::path& to,
                std::filesystem::copy_options options,

                std::error_code& ec );
(2) (C++17以上)
1) デフォルトの options として copy_options::none を指定した (2) と同等です。
2)options で表されるコピーオプションを使用して、単一のファイルを from から to にコピーします。 copy_options の任意のオプショングループ (copy_file に関係のないグループであっても) の2つ以上のオプションが options に存在する場合、動作は未定義です。
  • !is_regular_file(from) であれば (コピー元ファイルが存在しないか、普通のファイルでない)、エラーが報告されます。
  • そうでなく、コピー先ファイルが存在しなければ、
  • from の解決先のファイルの内容と属性が to の解決先のファイルにコピーされます (シンボリックリンクを辿ります)。
  • そうでなく、コピー先ファイルがすでに存在している場合、
  • 以下のいずれかが真であれば、エラーが報告されます。
  • tofrom が同じファイルである。 equivalent(from, to) によって判断されます。
  • to が普通のファイルでない。 !is_regular_file(to) によって判断されます。
  • copy_file 制御オプションがいずれも options に設定されていない。
  • そうでなく、 optionscopy_options::skip_existing が設定されていれば、何もしません。
  • そうでなく、 optionscopy_options::overwrite_existing が設定されていれば、 from の解決先のファイルの内容と属性が to の解決先のファイルにコピーされます。
  • そうでなく、 optionscopy_options::update_existing が設定されていれば、fromto よりも新しい場合にのみ、ファイルがコピーされます。 新しさは 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"

[編集]関連項目

コピー操作のセマンティクスを指定します
(列挙)[edit]
シンボリックリンクをコピーします
(関数)[edit]
(C++17)
ファイルまたはディレクトリをコピーします
(関数)[edit]
close