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) |
copy_options::none в качестве options.
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, если выделение памяти завершается неудачей.
std::filesystem::filesystem_error при ошибках в базовых вызовах API операционной системы, созданный с from в качестве первого аргумента пути, to в качестве второго аргумента пути и кодом ошибки ОС в качестве аргумента ошибки.
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 удалена |
См. также
|
(C++17) |
определяет семантику операций копирования (перечисление) |
|
(C++17) |
копирует символическую ссылку (функция) |
|
(C++17) |
копирует файлы или каталоги (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/filesystem/copy_file