std::filesystem::copy
Определено в заголовочном файле <filesystem> | ||
|---|---|---|
void copy( const std::filesystem::path& from,
const std::filesystem::path& to );
| (1) | (начиная с C++17) |
void copy( const std::filesystem::path& from,
const std::filesystem::path& to,
std::error_code& ec );
| (2) | (начиная с C++17) |
void copy( const std::filesystem::path& from,
const std::filesystem::path& to,
std::filesystem::copy_options options );
| (3) | (начиная с C++17) |
void copy( const std::filesystem::path& from,
const std::filesystem::path& to,
std::filesystem::copy_options options,
std::error_code& ec );
| (4) | (начиная с C++17) |
Копирует файлы и каталоги с различными параметрами.
1,2) Поведение по умолчанию, эквивалентное (3,4), где
copy_options::none используется в качестве options.
3,4) Копирует файл или каталог
from в файл или каталог to, используя параметры копирования, заданные в options. Поведение не определено, если в любой из групп параметров copy_options, присутствующих в options, указано более одного параметра (даже в группе copy_file).Функция действует следующим образом:
- Сначала, прежде чем выполнять какие-либо другие действия, получает тип и права доступа к
fromне более чем одним вызовом -
std::filesystem::symlink_status, если вoptionsприсутствуетcopy_options::skip_symlinks,copy_options::copy_symlinksилиcopy_options::create_symlinks; -
std::filesystem::statusв противном случае. - При необходимости получает состояние
toне более чем одним вызовом -
std::filesystem::symlink_status, если вoptionsприсутствуетcopy_options::skip_symlinksилиcopy_options::create_symlinks; -
std::filesystem::statusв противном случае (в том числе если вoptionsприсутствуетcopy_options::copy_symlinks). - Если
fromилиtoимеет тип файла, определяемый реализацией, то поведение этой функции определяется реализацией. - Если
fromне существует, сообщает об ошибке. - Если
fromиtoявляются одним и тем же файлом согласноstd::filesystem::equivalent, сообщает об ошибке. - Если
fromилиtoне является обычным файлом, каталогом или символической ссылкой согласноstd::filesystem::is_other, сообщает об ошибке. - Если
fromявляется каталогом, аto— обычным файлом, сообщает об ошибке. - Если
fromявляется символической ссылкой, то - Если в
optionsприсутствуетcopy_options::skip_symlink, ничего не делает. - В противном случае, если
toне существует и вoptionsприсутствуетcopy_options::copy_symlinks, действует так, как если бы было выполненоcopy_symlink(from, to). - В противном случае сообщает об ошибке.
- В противном случае, если
fromявляется обычным файлом, то - Если в
optionsприсутствуетcopy_options::directories_only, ничего не делает. - В противном случае, если в
optionsприсутствуетcopy_options::create_symlinks, создает символическую ссылку наto. Примечание:fromдолжен быть абсолютным путем, если толькоtoне находится в текущем каталоге. - В противном случае, если в
optionsприсутствуетcopy_options::create_hard_links, создает жесткую ссылку наto. - В противном случае, если
toявляется каталогом, действует так, как если бы было выполненоcopy_file(from, to/from.filename(), options)(создает копиюfromкак файл в каталогеto). - В противном случае действует так, как если бы было выполнено
copy_file(from, to, options)(копирует файл). - В противном случае, если
fromявляется каталогом и вoptionsустановленcopy_options::create_symlinks, сообщает об ошибке с кодом ошибкиstd::make_error_code(std::errc::is_a_directory). - В противном случае, если
fromявляется каталогом иoptionsсодержитcopy_options::recursiveили являетсяcopy_options::none, - Если
toне существует, сначала выполняетcreate_directory(to, from)(создает новый каталог с копией атрибутов исходного каталога). - Затем, независимо от того, существовал ли
toранее или был только что создан, перебирает файлы, содержащиеся вfrom, как если бы использовалсяfor (const std::filesystem::directory_entry& x : std::filesystem::directory_iterator(from)), и для каждой записи каталога рекурсивно вызываетcopy(x.path(), to/x.path().filename(), options | in-recursive-copy), где in-recursive-copy — специальный бит, который не оказывает иного влияния, если установлен вoptions. Единственная цель установки этого бита — предотвратить рекурсивное копирование подкаталогов, еслиoptionsравенcopy_options::none. - В противном случае ничего не делает.
Параметры
| from | - | путь к исходному файлу, каталогу или символической ссылке |
| to | - | путь к целевому файлу, каталогу или символической ссылке |
| ec | - | выходной параметр для передачи информации об ошибке в перегрузке, не выбрасывающей исключения |
Возвращаемое значение
отсутствует
Исключения
Любая перегрузка, не помеченная как noexcept, может выбросить std::bad_alloc при сбое выделения памяти.
1,3) При ошибках нижележащего API ОС выбрасывает
std::filesystem::filesystem_error, созданное с from в качестве первого аргумента-пути, с to в качестве второго аргумента-пути и с кодом ошибки ОС в качестве аргумента кода ошибки.
2,4) При сбое вызова API ОС устанавливает для параметра
std::error_code& код ошибки ОС, а при отсутствии ошибок выполняет ec.clear().Примечания
По умолчанию каталоги копируются нерекурсивно: файлы копируются, но подкаталоги — нет:
// Given
// /dir1 contains /dir1/file1, /dir1/file2, /dir1/dir2
// and /dir1/dir2 contains /dir1/dir2/file3
// After
std::filesystem::copy("/dir1", "/dir3");
// /dir3 is created (with the attributes of /dir1)
// /dir1/file1 is copied to /dir3/file1
// /dir1/file2 is copied to /dir3/file2
При использовании copy_options::recursive также рекурсивно копируются подкаталоги вместе с их содержимым.
// ...but after
std::filesystem::copy("/dir1", "/dir3", std::filesystem::copy_options::recursive);
// /dir3 is created (with the attributes of /dir1)
// /dir1/file1 is copied to /dir3/file1
// /dir1/file2 is copied to /dir3/file2
// /dir3/dir2 is created (with the attributes of /dir1/dir2)
// /dir1/dir2/file3 is copied to /dir3/dir2/file3
Пример
#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
fs::create_directories("sandbox/dir/subdir");
std::ofstream("sandbox/file1.txt").put('a');
fs::copy("sandbox/file1.txt", "sandbox/file2.txt"); // copy file
fs::copy("sandbox/dir", "sandbox/dir2"); // copy directory (non-recursive)
const auto copyOptions = fs::copy_options::update_existing
| fs::copy_options::recursive
| fs::copy_options::directories_only
;
fs::copy("sandbox", "sandbox_copy", copyOptions);
static_cast<void>(std::system("tree"));
fs::remove_all("sandbox");
fs::remove_all("sandbox_copy");
}
Возможный вывод:
.
├── sandbox
│ ├── dir
│ │ └── subdir
│ ├── dir2
│ ├── file1.txt
│ └── file2.txt
└── sandbox_copy
├── dir
│ └── subdir
└── dir2
8 directories, 2 files
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющих поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчет об ошибке | Применяется к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 3013 | C++17 |
перегрузка error_code помечена noexcept, но может выделять память | noexcept удален |
| LWG 2682 | C++17 | попытка создать символическую ссылку на каталог завершается успешно, но ничего не делает | сообщает об ошибке |
См. также
|
(C++17) | задает семантику операций копирования (перечисление) |
|
(C++17) | копирует символическую ссылку (функция) |
|
(C++17) | копирует содержимое файла (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/copy