名前空間
変種
操作

std::filesystem::copy_file

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

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

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

                const std::filesystem::path& to,
                std::filesystem::copy_options options );
bool copy_file( const std::filesystem::path& from,
                const std::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]