std::filesystem::copy_file
提供: cppreference.com
< cpp | filesystem
<tbody>
</tbody>
| ヘッダ <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の解決先のファイルにコピーされます (シンボリックリンクを辿ります)。
- そうでなく、コピー先ファイルがすでに存在している場合、
- 以下のいずれかが真であれば、エラーが報告されます。
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 |
例
Run this code
#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) |
ファイルまたはディレクトリをコピーします (関数) |