Namespaces
Variants

std::filesystem:: copy

From cppreference.net
Défini dans l'en-tête <filesystem>
void copy ( const std:: filesystem :: path & from,
const std:: filesystem :: path & to ) ;
(1) (depuis C++17)
(2) (depuis C++17)
(3) (depuis C++17)
(4) (depuis C++17)

Copie les fichiers et répertoires, avec diverses options.

1,2) La valeur par défaut, équivalente à (3,4) avec copy_options::none utilisé comme options .
3,4) Copie le fichier ou le répertoire from vers le fichier ou le répertoire to , en utilisant les options de copie indiquées par options . Le comportement est indéfini s'il y a plus d'une option dans l'un des copy_options groupes d'options présents dans options (même dans le groupe copy_file ).

Le comportement est le suivant :

  • Premièrement, avant toute autre chose, obtient le type et les permissions de from par pas plus d'un seul appel à
  • Si nécessaire, obtient le statut de to , par pas plus d'un seul appel à
  • Si l'un des deux, from ou to a un type de fichier défini par l'implémentation, les effets de cette fonction sont définis par l'implémentation.
  • Si from n'existe pas, signale une erreur.
  • Si from et to correspondent au même fichier tel que déterminé par std::filesystem::equivalent , signale une erreur.
  • Si l'un des deux, from ou to n'est pas un fichier régulier, un répertoire ou un lien symbolique, tel que déterminé par std::filesystem::is_other , signale une erreur.
  • Si from est un répertoire, mais que to est un fichier régulier, signale une erreur.
  • Si from est un lien symbolique, alors
  • Si copy_options::skip_symlink est présent dans options , ne fait rien.
  • Sinon, si to n'existe pas et copy_options::copy_symlinks est présent dans options , alors se comporte comme copy_symlink ( from, to ) .
  • Sinon, signale une erreur.
  • Sinon, si from est un fichier régulier, alors
  • Si copy_options::directories_only est présent dans options , ne fait rien.
  • Sinon, si copy_options::create_symlinks est présent dans options , crée un lien symbolique vers to . Note : from doit être un chemin absolu sauf si to se trouve dans le répertoire courant.
  • Sinon, si copy_options::create_hard_links est présent dans options , crée un lien physique vers to .
  • Sinon, si to est un répertoire, se comporte comme copy_file ( from, to / from. filename ( ) , options ) (crée une copie de from en tant que fichier dans le répertoire to ).
  • Sinon, se comporte comme copy_file ( from, to, options ) (copie le fichier).
  • Sinon, si from est un répertoire et que copy_options::create_symlinks est défini dans options , signale une erreur avec un code d'erreur égal à std:: make_error_code ( std:: errc :: is_a_directory ) .
  • Sinon, si from est un répertoire et que soit options contient copy_options::recursive , soit est égal à copy_options::none ,
  • Si to n'existe pas, exécute d'abord create_directory ( to, from ) (crée le nouveau répertoire avec une copie des attributs de l'ancien répertoire).
  • Ensuite, que to existe déjà ou ait été créé, itère sur les fichiers contenus dans from comme si par for ( const std:: filesystem :: directory_entry & x : std:: filesystem :: directory_iterator ( from ) ) et pour chaque entrée de répertoire, appelle récursivement copy ( x. path ( ) , to / x. path ( ) . filename ( ) , options | in - recursive - copy ) , où in-recursive-copy est un bit spécial qui n'a aucun autre effet lorsqu'il est défini dans options . (Le seul but de définir ce bit est d'empêcher la copie récursive des sous-répertoires si options est copy_options::none .)
  • Sinon, ne fait rien.

Table des matières

Paramètres

from - chemin vers le fichier source, répertoire ou lien symbolique
to - chemin vers le fichier cible, répertoire ou lien symbolique
ec - paramètre de sortie pour le rapport d'erreur dans la surcharge non-lancée

Valeur de retour

(aucun)

Exceptions

Toute surcharge non marquée noexcept peut lever std::bad_alloc si l'allocation de mémoire échoue.

1,3) Lance std::filesystem::filesystem_error en cas d'erreurs de l'API système sous-jacente, construit avec from comme premier argument de chemin, to comme deuxième argument de chemin, et le code d'erreur du système comme argument de code d'erreur.
2,4) Définit un paramètre std:: error_code & au code d'erreur de l'API du système d'exploitation si un appel d'API système échoue, et exécute ec. clear ( ) si aucune erreur ne survient.

Notes

Le comportement par défaut lors de la copie de répertoires est la copie non récursive : les fichiers sont copiés, mais pas les sous-répertoires :

// Étant donné
// /dir1 contient /dir1/file1, /dir1/file2, /dir1/dir2
// et /dir1/dir2 contient /dir1/dir2/file3
// Après
std::filesystem::copy("/dir1", "/dir3");
// /dir3 est créé (avec les attributs de /dir1)
// /dir1/file1 est copié vers /dir3/file1
// /dir1/file2 est copié vers /dir3/file2

Alors qu'avec copy_options::recursive , les sous-répertoires sont également copiés, avec leur contenu, de manière récursive.

// ...mais après
std::filesystem::copy("/dir1", "/dir3", std::filesystem::copy_options::recursive);
// /dir3 est créé (avec les attributs de /dir1)
// /dir1/file1 est copié vers /dir3/file1
// /dir1/file2 est copié vers /dir3/file2
// /dir3/dir2 est créé (avec les attributs de /dir1/dir2)
// /dir1/dir2/file3 est copié vers /dir3/dir2/file3

Exemple

#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    fs::create_directories("sandbox/dir/subdir");
    std::ofstream("sandbox/file1.txt").put('a');
    fs::copy("sandbox/file1.txt", "sandbox/file2.txt"); // copier le fichier
    fs::copy("sandbox/dir", "sandbox/dir2"); // copier le répertoire (non récursif)
    const auto copyOptions = fs::copy_options::update_existing
                           | fs::copy_options::recursive
                           | fs::copy_options::directories_only
                           ;
    fs::copy("sandbox", "sandbox_copy", copyOptions); 
    static_cast<void>(std::system("tree"));
    fs::remove_all("sandbox");
    fs::remove_all("sandbox_copy");
}

Sortie possible :

.
├── sandbox
│   ├── dir
│   │   └── subdir
│   ├── dir2
│   ├── file1.txt
│   └── file2.txt
└── sandbox_copy
    ├── dir
    │   └── subdir
    └── dir2
8 répertoires, 2 fichiers

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 3013 C++17 error_code surcharge marquée noexcept mais peut allouer de la mémoire noexcept supprimé
LWG 2682 C++17 tentative de création d'un lien symbolique pour un répertoire réussit mais ne fait rien signale une erreur

Voir aussi

spécifie la sémantique des opérations de copie
(énumération)
copie un lien symbolique
(fonction)
(C++17)
copie le contenu d'un fichier
(fonction)