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
. Поведение не определено, если присутствует более одной опции в любой из
copy_options
групп опций в
options
(даже в группе
copy_file
, которая не относится к
copy
).
Поведение выглядит следующим образом:
-
Сначала, прежде чем делать что-либо ещё, получает тип и права доступа
from
не более чем одним вызовом
status
(или, если
copy_options::skip_symlinksилиcopy_options::create_symlinksприсутствуют в options , вызовомsymlink_status). - При необходимости получает статус to тем же способом, не более чем одним вызовом status или symlink_status.
- Если 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 . Примечание: from должен быть абсолютным путем, если только to не находится в текущем каталоге. -
Иначе, если
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, в 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 директории, одна из которых имеет поддиректорию // 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"); }
Смотрите также
|
определяет семантику операций копирования
(перечисление) |
|
|
копирует символическую ссылку
(функция) |
|
|
копирует содержимое файла
(функция) |