std::experimental::filesystem:: copy
From cppreference.net
<
cpp
|
experimental
|
fs
|
ヘッダー
<experimental/filesystem>
で定義
|
||
|
void
copy
(
const
path
&
from,
const
path
&
to
)
;
void copy ( const path & from, const path & to, error_code & ec ) ; |
(1) | (filesystem TS) |
|
void
copy
(
const
path
&
from,
const
path
&
to, copy_options options
)
;
void copy ( const path & from, const path & to, copy_options options, error_code & ec ) ; |
(2) | (filesystem TS) |
ファイルとディレクトリを様々なオプションでコピーします:
1)
デフォルトは、
(2)
と同等であり、
copy_options::none
が
options
として使用されます。
2)
ファイルまたはディレクトリを
from
からファイルまたはディレクトリ
to
へコピーします。
options
で指定されたコピーオプションを使用します。
options
内のいずれかの
copy_options
オプショングループ(
copy
に関連しない
copy_file
グループも含む)に複数のオプションが存在する場合、動作は未定義です。
動作は以下の通りです:
-
まず最初に、他の何よりも前に、
from
の型とパーミッションを、
status
の呼び出しを1回以内で取得する(あるいは、
copy_options::skip_symlinksまたはcopy_options::create_symlinksが options に存在する場合は、symlink_statusの呼び出しによって取得する)。 - 必要に応じて、 to のステータスを同じ方法で、statusまたはsymlink_statusの呼び出しを1回以内で取得する。
- from が存在しない場合、エラーを報告する。
- from と to が equivalent() によって決定される同じファイルである場合、エラーを報告する。
- from または to のいずれかが、 is_other によって決定される通常ファイル、ディレクトリ、またはシンボリックリンクでない場合、エラーを報告する。
- from がディレクトリであり、かつ to が通常ファイルである場合、エラーを報告する。
- from がシンボリックリンクである場合、
-
-
copy_options::skip_symlinkが options に含まれている場合、何も行わない。 -
それ以外の場合、
to
が存在せず、かつ
copy_options::copy_symlinksが options に含まれている場合、 copy_symlink ( from, to ) として動作する。 - それ以外の場合、エラーを報告する。
-
- それ以外の場合、 from が通常ファイルであれば、
-
-
copy_options::directories_onlyが options に含まれている場合、何も行わない。 -
そうでなく、
copy_options::create_symlinksが options に含まれている場合、 to へのシンボリックリンクを作成する。注: to がカレントディレクトリ内にない限り、 from は絶対パスでなければならない。 -
そうでなく、
copy_options::create_hard_linksが options に含まれている場合、 to へのハードリンクを作成する。 - そうでなく、 to がディレクトリの場合、 copy_file ( from, to / from. filename ( ) , options ) を実行した場合と同様の動作を行う( from のコピーをディレクトリ to 内のファイルとして作成する)。
- そうでない場合、 copy_file ( from, to, options ) を実行した場合と同様の動作を行う(ファイルをコピーする)。
-
-
それ以外の場合、
from
がディレクトリであり、かつ
options
が
copy_options::recursiveを持つか、またはcopy_options::noneである場合。
-
- to が存在しない場合、最初に create_directory ( to, from ) を実行する(古いディレクトリの属性をコピーして新しいディレクトリを作成)。
-
その後、
to
が既に存在していたか、新しく作成されたかに関わらず、
from
に含まれるファイルを
for
(
const
directory_entry
&
x
:
directory_iterator
(
from
)
)
によって反復処理し、各ディレクトリエントリに対して
copy
(
x.
path
(
)
, to
/
x.
path
(
)
.
filename
(
)
, options
|
unspecified
)
を再帰的に呼び出す。ここで
unspecified
は、
options
で設定された場合に他の効果を持たない特別なビットである(このビットを設定する唯一の目的は、
options
が
copy_options::noneの場合にサブディレクトリの再帰的コピーを防ぐことである)。
- それ以外の場合は何もしません。
目次 |
パラメータ
| from | - | ソースファイル、ディレクトリ、またはシンボリックリンクへのパス |
| to | - | ターゲットファイル、ディレクトリ、またはシンボリックリンクへのパス |
| ec | - | 非スローオーバーロードでのエラー報告用出力パラメータ |
戻り値
(なし)
例外
The overload that does not take an error_code & parameter throws filesystem_error on underlying OS API errors, constructed with from as the first argument, to as the second argument, and the OS error code as the error code argument. std:: bad_alloc may be thrown if memory allocation fails. The overload taking an error_code & parameter sets it to the OS API error code if an OS API call fails, and executes ec. clear ( ) if no errors occur. This overload has
noexcept
仕様:
noexcept
注記
ディレクトリをコピーする際のデフォルトの動作は非再帰的コピーです:ファイルはコピーされますが、サブディレクトリはコピーされません:
// 前提条件 // /dir1 は /dir1/file1, /dir1/file2, /dir1/dir2 を含む // かつ /dir1/dir2 は /dir1/dir2/file3 を含む // 実行後 std::experimental::filesystem::copy("/dir1", "/dir3"); // /dir3 が作成される (/dir1 の属性とともに) // /dir1/file1 が /dir3/file1 にコピーされる // /dir1/file2 が /dir3/file2 にコピーされる
copy_options::recursive
を使用すると、サブディレクトリもその内容と共に再帰的にコピーされます。
// ...しかしその後 std::experimental::filesystem::copy("/dir1", "/dir3", copy_options::recursive); // /dir3が作成される(/dir1の属性を持つ) // /dir1/file1が/dir3/file1にコピーされる // /dir1/file2が/dir3/file2にコピーされる // /dir3/dir2が作成される(/dir1/dir2の属性を持つ) // /dir1/dir2/file3が/dir3/dir2/file3にコピーされる
例
このコードを実行
#include <experimental/filesystem> #include <fstream> #include <iostream> namespace fs = std::experimental::filesystem; int main() { fs::create_directories("sandbox/dir/subdir"); std::ofstream("sandbox/file1.txt").put('a'); fs::copy("sandbox/file1.txt", "sandbox/file2.txt"); // ファイルをコピー fs::copy("sandbox/dir", "sandbox/dir2"); // ディレクトリをコピー(非再帰的) // sandboxには2つのファイルと2つのディレクトリがあり、そのうち1つはサブディレクトリを持つ // sandbox/file1.txt // sandbox/file2.txt // sandbox/dir2 // sandbox/dir // sandbox/dir/subdir fs::copy("sandbox", "sandbox/copy", fs::copy_options::recursive); // sandbox/copyには上記のファイルとサブディレクトリのコピーが含まれる fs::remove_all("sandbox"); }
関連項目
|
コピー操作のセマンティクスを指定する
(列挙型) |
|
|
シンボリックリンクをコピーする
(関数) |
|
|
ファイル内容をコピーする
(関数) |