Namespaces
Variants

std::filesystem:: copy_file

From cppreference.net
ヘッダーで定義 <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,

std:: error_code & ec ) ;
(2) (C++17以降)
(3) (C++17以降)
(4) (C++17以降)
1,2) デフォルトでは、 (3,4) と同等であり、 copy_options::none options として使用されます。
3,4) from から to へ単一ファイルをコピーし、 options で指定されたコピーオプションを使用します。 options 内のいずれかの copy_options オプショングループに複数のオプションが存在する場合( filesystem::copy_file に関連しないグループであっても)、動作は未定義です。
  • !filesystem::is_regular_file(from) の場合(ソースファイルが存在しないか、通常ファイルでないため)、エラーを報告します。
  • それ以外の場合、宛先ファイルが存在しない場合は、
  • from が解決するファイルの内容と属性を to が解決するファイルにコピーします(シンボリックリンクは追跡されます)。
  • それ以外の場合、宛先ファイルが既に存在する場合は、
  • 以下のいずれかが真の場合、エラーを報告します:
  • それ以外の場合、 copy_options::skip_existing options に設定されている場合は、何もしません。
  • それ以外の場合、 copy_options::overwrite_existing options に設定されている場合は、 from が解決するファイルの内容と属性を to が解決するファイルにコピーします。
  • それ以外の場合、 copy_options::update_existing options に設定されている場合は、 from to より新しい場合( filesystem::last_write_time() で定義)にのみファイルをコピーします。

例外を送出しないオーバーロードは、 エラーが発生した場合に false を返します。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters, Return value, Exceptions, Notes, Example, Defect reports, See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 番号部分もそのまま保持しています - フォーマットと構造は完全に維持されています

パラメータ

from - ソースファイルへのパス
to - ターゲットファイルへのパス
ec - 例外を投げないオーバーロードにおけるエラー報告用出力パラメータ

戻り値

true ファイルがコピーされた場合、 false それ以外の場合。

例外

noexcept でマークされていないオーバーロードは、 メモリ確保に失敗した場合に std::bad_alloc をスローする可能性があります。

1,3) 基盤OS APIエラー時に std::filesystem::filesystem_error をスローします。第一パス引数に from 、第二パス引数に to 、エラーコード引数にOSエラーコードを指定して構築されます。
2,4) OS API呼び出しが失敗した場合、 std:: error_code & パラメータをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。

注記

これらの関数は、最大でも1回の直接または間接的な filesystem::status(to) の呼び出しを含みます(ファイルの存在確認と、 filesystem::copy_options::update_existing オプションの場合、最終更新時刻の確認の両方に使用されます)。

ディレクトリをコピーするために filesystem::copy_file を使用するとエラーが報告されます:その場合は filesystem::copy を使用してください。

filesystem::copy_file はシンボリックリンクを追従します: その場合は filesystem::copy_symlink または filesystem::copy filesystem::copy_options::copy_symlinks オプションで使用してください。

#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");
    // これでsandbox内に2つのファイルが存在:
    std::cout << "file1.txt holds: "
              << std::ifstream("sandbox/file1.txt").rdbuf() << '\n';
    std::cout << "file2.txt holds: "
              << std::ifstream("sandbox/file2.txt").rdbuf() << '\n';
    // ディレクトリのコピーに失敗
    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)
ファイルまたはディレクトリをコピーする
(関数)