Namespaces
Variants

std::experimental::filesystem:: copy

From cppreference.net
Определено в заголовочном файле <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");
}

Смотрите также

определяет семантику операций копирования
(перечисление)
копирует символическую ссылку
(функция)
копирует содержимое файла
(функция)