Namespaces
Variants

std::experimental::filesystem:: copy

From cppreference.net
Défini dans l'en-tête <experimental/filesystem>
void copy ( const path & from, const path & to ) ;
void copy ( const path & from, const path & to, error_code & ec ) ;
(1) (filesystem TS)
void copy ( const path & from, const path & to, copy_options options ) ;
void copy ( const path & from, const path & to, copy_options options, error_code & ec ) ;
(2) (filesystem TS)

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

1) La valeur par défaut, équivalente à (2) avec copy_options::none utilisé comme options .
2) 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 , qui n'est pas pertinent pour copy ).

Le comportement est le suivant :

  • Premièrement, avant toute autre opération, obtient le type et les permissions de from par pas plus d'un seul appel à status (ou, si copy_options::skip_symlinks ou copy_options::create_symlinks sont présents dans options , par un appel à symlink_status ).
  • Si nécessaire, obtient le statut de to de la même manière, par pas plus d'un seul appel à status ou symlink_status.
  • Si from n'existe pas, signale une erreur.
  • Si from et to sont le même fichier tel que déterminé par equivalent() , signale une erreur.
  • Si soit from soit to n'est pas un fichier régulier, un répertoire ou un lien symbolique, tel que déterminé par is_other , signale une erreur.
  • Si from est un répertoire, mais 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 que 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 ordinaire, 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 est 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, alors 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 soit options contient copy_options::recursive , soit est 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 directory_entry & x : directory_iterator ( from ) ) et pour chaque entrée de répertoire, appelle récursivement copy ( x. path ( ) , to / x. path ( ) . filename ( ) , options | unspecified ) , où unspecified 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'erreurs dans la surcharge non-lancante

Valeur de retour

(aucun)

Exceptions

The overload that does not take an error_code & parameter throws filesystem_error on underlying OS API errors, constructed with from as the first argument, vers as the second argument, and the OS error code as the error code argument. std:: bad_alloc **Note:** Le texte a été laissé en anglais car : 1. Il contient des balises HTML qui ne doivent pas être traduites 2. Il s'agit de code C++ (`std::bad_alloc`) qui ne doit pas être traduit 3. C'est un terme technique spécifique au C++ qui doit rester en anglais pour la précision technique La structure HTML et le contenu des balises de code sont restés identiques à l'original, conformément aux instructions. may be thrown if memory allocation fails. The overload taking an error_code & parameter sets it to the OS API error code if an OS API call fails, and executes ec. clear ( ) if no errors occur. This overload has
noexcept spécification :
noexcept

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::experimental::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::experimental::filesystem::copy("/dir1", "/dir3", 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 <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::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)
    // sandbox contient 2 fichiers et 2 répertoires, dont un avec un sous-répertoire
    // sandbox/file1.txt
    // sandbox/file2.txt
    // sandbox/dir2
    // sandbox/dir
    //    sandbox/dir/subdir
    fs::copy("sandbox", "sandbox/copy", fs::copy_options::recursive);
    // sandbox/copy contient des copies des fichiers et sous-répertoires ci-dessus
    fs::remove_all("sandbox");
}

Voir aussi

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