std::filesystem::copy
| Definido en el archivo de encabezado <filesystem>
|
||
void copy( const std::filesystem::path& from, const std::filesystem::path& to ); void copy( const std::filesystem::path& from, const std::filesystem::path& to, std::error_code& ec ); |
(1) | (desde C++17) |
void copy( const std::filesystem::path& from, const std::filesystem::path& to, std::filesystem::copy_options options ); void copy( const std::filesystem::path& from, const std::filesystem::path& to, std::filesystem::copy_options options, std::error_code& ec ); |
(2) | (desde C++17) |
Copia archivos y directorios con una variedad de opciones.
copy_options::none utilizada como options.from al archivo o directorio 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 el grupo copy_file).El comportamiento es el siguiente:
- Primero, antes de hacer algo, se obtiene el tipo y permisos de
fromsin más de una sola llamada a
- std::filesystem::symlink_status, si
copy_options::skip_symlinks,copy_options::copy_symlinks, ocopy_options::create_symlinksestá presente enoptions; - std::filesystem::status de lo contrario.
- std::filesystem::symlink_status, si
- Si es necesario, obtiene el estado de
to, sin más de una sola llamada a
- std::filesystem::symlink_status, si
copy_options::skip_symlinksocopy_options::create_symlinksestá presente enoptions; - std::filesystem::status de lo contrario (incluyendo el caso donde
copy_options::copy_symlinksestá presente enoptions).
- std::filesystem::symlink_status, si
- Si
fromototiene un tipo de archivo definido por la implementación, los efectos de esta función están definidos por la implementación. - Si
fromno existe, se informa de un error. - Si
fromytoson el mismo archivo, como se determina por std::filesystem::equivalent, se informa de un error. - Si
fromotono es un archivo regular, un directorio, o un enlace simbólico, como se determina por std::filesystem::is_other, se informa de un error. - Si
fromes un directorio, perotoes un archivo regular, se informa de un error. - Si
fromes un enlace simbólico, entonces
- Si
copy_options::skip_symlinkestá presente enoptions, no hace nada. - De lo contrario, si
tono existe ycopy_options::copy_symlinksestá presente enoptions, entonces se comporta como sicopy_symlink(from, to). - De lo contrario, se informa de un error.
- Si
- De lo contrario, si
fromes un archivo regular, entonces
- Si
copy_options::directories_onlyestá presente enoptions, no hace nada. - De lo contrario, si
copy_options::create_symlinksestá presente enoptions, crea un enlace simbólico ato. Nota:fromdebe ser una ruta de acceso absoluta, a menos quetose encuentre en el directorio actual. - De lo contrario, si
copy_options::create_hard_linksestá presente enoptions, crea un enlace físico ato. - De lo contrario, si
toes un directorio, entonces se comporta como sicopy_file(from, to/from.filename(), options)(crea una copia defromcomo un archivo en el directorioto). - De lo contrario, se comporta como si
copy_file(from, to, options)(copia el archivo).
- Si
- De lo contrario, si
fromes un directorio ycopy_options::create_symlinksestá establecida enoptions, se informa de un error con un código de error igual astd::make_error_code(std::errc::is_a_directory). - De lo contrario, si
fromes un directorio y ya sea queoptionstengacopy_options::recursiveo seacopy_options::none,
- Si
tono existe, primero ejecutacreate_directory(to, from)(crea el nuevo directorio con una copia de los atributos del directorio antiguo). - Entonces, si
toya existía o se acaba de crear, itera sobre los archivos contenidos enfromcomo si fuera porfor (const std::filesystem::directory_entry& x : std::filesystem::directory_iterator(from))y para cada entrada de directorio, llama recursivamente acopy(x.path(), to/x.path().filename(), options | en-copia-recursiva), donde en-copia-recursiva es un bit especial que no tiene otro efecto cuando se establece enoptions. (El único propósito de establecer este bit es prevenir la copia recursiva de subdirectorios sioptionsescopy_options::none).
- Si
- De lo contrario no hace nada.
Parámetros
| from | - | La ruta de acceso al archivo, directorio o enlace simbólico fuente. |
| to | - | La ruta de acceso al archivo, directorio o enlace simbólico destino. |
| ec | - | El parámetro de salida para informe de errores en la sobrecarga que no lanza excepciones. |
Valor de retorno
(Ninguno)
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
El comportamiento por defecto al copiar directorios es la copia no recursiva: los archivos se copian, pero no los subdirectorios:
// Dado que
// /dir1 contiene /dir1/file1, /dir1/file2, /dir1/dir2
// y /dir1/dir2 contiene /dir1/dir2/file3
// Después de
std::filesystem::copy("/dir1", "/dir3");
// /dir3 se crea (con los atributos de /dir1)
// /dir1/file1 se copia a /dir3/file1
// /dir1/file2 se copia a /dir3/file2
mientras que con copy_options::recursive, los subdirectorios también se copian, con su contenido, recursivamente.
// ...pero después de
std::filesystem::copy("/dir1", "/dir3", std::filesystem::copy_options::recursive);
// /dir3 se crea (con los atributos de /dir1)
// /dir1/file1 se copia a /dir3/file1
// /dir1/file2 se copia a /dir3/file2
// /dir3/dir2 se crea (con los atributos de /dir1/dir2)
// /dir1/dir2/file3 se copia a /dir3/dir2/file3
Ejemplo
Este ejemplo demuestra la copia de archivos y directorios de forma no recursiva y recursiva. Requiere que el programa tree esté presente para generar el árbol de directorios.
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::create_directories("entorno/dir/subdir");
std::ofstream("entorno/archivo1.txt").put('a');
fs::copy("entorno/archivo1.txt", "entorno/archivo2.txt"); // copiar archivo
fs::copy("entorno/dir", "entorno/dir2"); // copiar directorio (no recursivo)
const auto opcDeCopia = fs::copy_options::update_existing
| fs::copy_options::recursive
| fs::copy_options::directories_only
;
fs::copy("entorno", "copia_de_entorno", opcDeCopia);
static_cast<void>(std::system("tree"));
fs::remove_all("entorno");
fs::remove_all("copia_de_entorno");
}
Posible salida:
.
├── entorno
│ ├── dir
│ │ └── subdir
│ ├── dir2
│ ├── archivo1.txt
│ └── archivo2.txt
└── copia_de_entorno
├── dir
│ └── subdir
└── dir2
8 directorios, 2 archivos
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 3013 | C++17 | La sobrecarga con error_code está marcada con noexcept pero puede asignar memoria.
|
Se eliminó noexcept.
|
| LWG 2682 | C++17 | Intentar crear un enlace simbólico para un directorio tiene éxito pero no hace nada. | Se informa de un error. |
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 el contenido de un archivo. (función) |