Namespaces
Variants

std::filesystem:: copy_file

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

std:: error_code & ec ) ;
(2) (начиная с C++17)
(3) (начиная с C++17)
(4) (начиная с C++17)
1,2) По умолчанию, эквивалентно (3,4) с использованием copy_options::none в качестве options .
3,4) Копирует один файл из from в to , используя опции копирования, указанные в options . Поведение не определено, если в любой из групп опций copy_options присутствует более одной опции в options (даже в группах, не относящихся к filesystem::copy_file ).
  • Если !filesystem::is_regular_file(from) (либо потому, что исходный файл не существует, либо потому, что он не является обычным файлом), сообщает об ошибке.
  • Иначе, если файл назначения не существует,
  • копирует содержимое и атрибуты файла, на который указывает from , в файл, на который указывает to (символические ссылки разыменовываются).
  • Иначе, если файл назначения уже существует,
  • сообщает об ошибке, если верно любое из следующего:
  • to и from являются одинаковыми, как определено filesystem::equivalent(from, to) ;
  • to не является обычным файлом, как определено !filesystem::is_regular_file(to) ;
  • ни одна из управляющих опций filesystem::copy_file не установлена в options .
  • Иначе, если в options установлен copy_options::skip_existing , ничего не делает.
  • Иначе, если в options установлен copy_options::overwrite_existing , копирует содержимое и атрибуты файла, на который указывает from , в файл, на который указывает to .
  • Иначе, если в options установлен copy_options::update_existing , копирует файл только если from новее, чем to , как определено filesystem::last_write_time() .

Невозбуждающие перегрузки возвращают false при возникновении ошибки.

Содержание

Параметры

from - путь к исходному файлу
to - путь к целевому файлу
ec - выходной параметр для сообщения об ошибках в непорождающей перегрузке

Возвращаемое значение

true если файл был скопирован, false в противном случае.

Исключения

Любая перегрузка, не помеченная noexcept , может выбрасывать std::bad_alloc при неудачном выделении памяти.

1,3) Выбрасывает std::filesystem::filesystem_error при ошибках базового API ОС, созданный с from в качестве первого аргумента пути, to в качестве второго аргумента пути и кодом ошибки ОС в качестве аргумента кода ошибки.
2,4) Устанавливает параметр std:: error_code & в код ошибки API ОС при сбое вызова API ОС, и выполняет ec. clear ( ) если ошибок не возникает.

Примечания

Функции включают не более одного прямого или косвенного вызова 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 два файла:
    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 Applied to Behavior as published Correct behavior
LWG 3014 C++17 error_code overload marked noexcept but can allocate memory noexcept removed

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

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