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); - в
optionsне задан ни один управляющий параметрfilesystem::copy_file. - В противном случае, если в
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 при сбое выделения памяти.
std::filesystem::filesystem_error, созданное с from в качестве первого аргумента пути, to в качестве второго аргумента пути и кодом ошибки ОС в качестве аргумента кода ошибки.std::error_code& код ошибки 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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| 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/cpp/filesystem/copy_file