std::filesystem::copy_file
| Definido en el archivo de encabezado <filesystem>
|
||
bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to ); bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to, std::error_code& ec ); |
(1) | (desde C++17) |
bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to, std::filesystem::copy_options options ); bool copy_file( const std::filesystem::path& from, const std::filesystem::path& to, std::filesystem::copy_options options, std::error_code& ec ); |
(2) | (desde C++17) |
copy_options::none utilizada como options.from a to, utilizando las opciones de copia indicadas por options. El comportamiento no está definido si hay más de una opción en alguna de las opciones de copia copy_options presentes en el grupo de opciones options (incluso en los grupos no relevantes para std::filesystem::copy_file).
- Si std::filesystem::is_regular_file (ya sea porque el archivo fuente no existe o porque no es un archivo regular), se informa de un error.
- De lo contrario, si el archivo destino no existe:
- Copia el contenido y los atributos del archivo al cual se resuelve
fromal archivo al que se resuelveto(se siguen los enlaces simbólicos).
- Copia el contenido y los atributos del archivo al cual se resuelve
- De lo contrario, si el archivo destino ya existe:
- Se informa de un error si y solo si cualquiera de lo siguiente es verdadero:
toyfromson el mismo archivo, como se determina por std::filesystem::equivalent;tono es un archivo regular, como se determina por std::filesystem::is_regular_file;- ninguna de las opciones de control std::filesystem::copy_file están establecidas en
options.
- De lo contrario, si
copy_options::skip_existingestá establecida enoptions, no hace nada. - De lo contrario, si
copy_options::overwrite_existingestá establecida enoptions, copia el contenido y los atributos del archivo al cual se resuelvefromal archivo al que se resuelveto. - De lo contrario, si
copy_options::update_existingestá establecida enoptions, solo copia el archivo sifromes más reciente queto, según se define por std::filesystem::last_write_time.
Las sobrecargas que no lanzan excepciones devuelven false si ocurre un error.
Parámetros
| from | - | La ruta de acceso al archivo fuente. |
| to | - | La ruta de acceso al archivo destino. |
| ec | - | El parámetro de salida para informe de errores en la sobrecarga que no lanza excepciones. |
Valor de retorno
true si se copió el archivo, false de lo contrario.
Excepciones
La sobrecarga que no toma un parámetro std::error_code& lanza filesystem::filesystem_error en los errores de la API del sistema operativo subyacente, construido con from como el primer argumento de la ruta de acceso, to como el segundo argumento de la ruta de acceso, y el código de error del sistema operativo como el argumento del código de error. La sobrecarga que toma un parámetro std::error_code& lo establece en el código de error de la API del sistema operativo si una llamada a la API del sistema operativo falla, y ejecuta ec.clear() si no ocurren errores. Cualquier sobrecarga que no está marcada con noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.
Notas
Las funciones involucran a lo sumo una llamada directa o indirecta a std::filesystem::status (utilizada tanto para determinar si el archivo existe, como para la opción filesystem::copy_options::update_existing, su último tiempo de escritura).
Se informa de un error cuando std::filesystem::copy_file se utiliza para copiar un directorio: utiliza std::filesystem::copy para eso.
std::filesystem::copy_file sigue los enlaces simbólicos: utiliza std::filesystem::copy_symlink o std::filesystem::copy con filesystem::copy_options::copy_symlinks para eso.
Ejemplos
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::create_directory("entorno_aislado");
std::ofstream("entorno_aislado/archivo1.txt").put('a');
fs::copy_file("entorno_aislado/archivo1.txt", "entorno_aislado/archivo2.txt");
// ahora hay dos archivos en entorno_aislado:
std::cout << "archivo1.txt alberga : "
<< std::ifstream("entorno_aislado/archivo1.txt").rdbuf() << '\n';
std::cout << "archivo2.txt alberga : "
<< std::ifstream("entorno_aislado/archivo2.txt").rdbuf() << '\n';
// fracasa al copiar el directorio
fs::create_directory("entorno_aislado/abc");
try {
fs::copy_file("entorno_aislado/abc", "entorno_aislado/def");
} catch(fs::filesystem_error& e) {
std::cout << "No se pudo copiar entorno_aislado/abc: " << e.what() << '\n';
}
fs::remove_all("entorno_aislado");
}
Posible salida:
archivo1.txt alberga : a
archivo2.txt alberga : a
No se pudo copiar entorno_aislado/abc: copy_file: Es un directorio: "entorno_aislado/abc", "entorno_aislado/def"
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3014 | C++17 | La sobrecarga con error_code está marcada con noexcept pero puede asignar memoria.
|
Se eliminó noexcept.
|
Véase también
(C++17) |
Especifica la semántica de las operaciones de copia. (enum) |
(C++17) |
Copia un enlace simbólico. (función) |
(C++17) |
Copia archivos o directorios. (función) |