Spec-Zone.ru › C++

std::filesystem::copy_file

Определено в заголовке <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)
bool copy_file( const std::filesystem::path& from,
                const std::filesystem::path& to,
                std::filesystem::copy_options options );
(3) (с C++17)
bool copy_file( 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 (даже в не относящихся к 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.
  • В противном случае, если copy_options::skip_existing установлен в options, ничего не делается.
  • В противном случае, если copy_options::overwrite_existing установлен в options, копирует содержимое и атрибуты файла, к которому ссылается from, в файл, к которому ссылается to.
  • В противном случае, если copy_options::update_existing установлен в options, файл копируется только если 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");
 
    // now there are two files in 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';
 
    // fail to copy directory
    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 Применяется к Поведение, опубликованное Правильное поведение
LWG 3014 C++17 error_code перегрузка помечена noexcept, но может выделять память noexcept удалена

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/filesystem/copy_file

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API