名前空間
変種
操作

std::filesystem::copy_file

From cppreference.com
 
 
 
ヘッダー <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以降)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,

                std::filesystem::copy_options options );
(3) (C++17以降)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,
                std::filesystem::copy_options options,

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

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

目次

[編集] パラメータ

from - ソースファイルへのパス
to - ターゲットファイルへのパス
エラーコード - 例外を投げないオーバーロードでのエラー報告のための出力パラメータ

[編集] 戻り値

ファイルがコピーされた場合は true、そうでなければ false

[編集] 例外

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

1,3) 基盤となるOS APIエラーが発生した場合、std::filesystem::filesystem_error をスローします。コンストラクタは、最初のパス引数として from、2番目のパス引数として to、エラーコード引数としてOSのエラーコードを受け取ります。
2,4) OS API呼び出しが失敗した場合、OS APIのエラーコードを `std::error_code&` パラメータに設定し、エラーが発生しなかった場合は `ec.clear()` を実行します。

[編集] 備考

これらの関数は、最大で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)
ファイルまたはディレクトリをコピーする
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)