std::filesystem:: copy_file
|
ヘッダーで定義
<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,
|
(2) | (C++17以降) |
|
bool
copy_file
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(3) | (C++17以降) |
|
bool
copy_file
(
const
std::
filesystem
::
path
&
from,
const
std::
filesystem
::
path
&
to,
|
(4) | (C++17以降) |
copy_options::none
が
options
として使用されます。
- !filesystem::is_regular_file(from) の場合(ソースファイルが存在しないか、通常ファイルでないため)、エラーを報告します。
- それ以外の場合、宛先ファイルが存在しない場合は、
-
- from が解決するファイルの内容と属性を to が解決するファイルにコピーします(シンボリックリンクは追跡されます)。
- それ以外の場合、宛先ファイルが既に存在する場合は、
-
- 以下のいずれかが真の場合、エラーを報告します:
-
- to と from が filesystem::equivalent(from, to) によって同一と判定される場合;
- to が !filesystem::is_regular_file(to) によって通常ファイルでないと判定される場合;
- options に filesystem::copy_file の制御オプションが一つも設定されていない場合。
-
それ以外の場合、
copy_options::skip_existingが options に設定されている場合は、何もしません。 -
それ以外の場合、
copy_options::overwrite_existingが options に設定されている場合は、 from が解決するファイルの内容と属性を to が解決するファイルにコピーします。 -
それ以外の場合、
copy_options::update_existingが options に設定されている場合は、 from が to より新しい場合( filesystem::last_write_time() で定義)にのみファイルをコピーします。
例外を送出しないオーバーロードは、 エラーが発生した場合に false を返します。
目次 |
パラメータ
| from | - | ソースファイルへのパス |
| to | - | ターゲットファイルへのパス |
| ec | - | 例外を投げないオーバーロードにおけるエラー報告用出力パラメータ |
戻り値
true ファイルがコピーされた場合、 false それ以外の場合。
例外
noexcept
でマークされていないオーバーロードは、
メモリ確保に失敗した場合に
std::bad_alloc
をスローする可能性があります。
注記
これらの関数は、最大でも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)
|
コピー操作のセマンティクスを指定する
(列挙型) |
|
(C++17)
|
シンボリックリンクをコピーする
(関数) |
|
(C++17)
|
ファイルまたはディレクトリをコピーする
(関数) |