Namespaces
Variants

std::filesystem:: copy

From cppreference.net
Definiert im Header <filesystem>
void copy ( const std:: filesystem :: path & from,
const std:: filesystem :: path & to ) ;
(1) (seit C++17)
(2) (seit C++17)
(3) (seit C++17)
(4) (seit C++17)

Kopiert Dateien und Verzeichnisse mit verschiedenen Optionen.

1,2) Die Standardeinstellung, entspricht (3,4) mit copy_options::none verwendet als options .
3,4) Kopiert die Datei oder das Verzeichnis from zur Datei oder zum Verzeichnis to , unter Verwendung der durch options angegebenen Kopieroptionen. Das Verhalten ist undefiniert, wenn mehr als eine Option in einer der copy_options Optionsgruppen in options vorhanden ist (selbst in der copy_file -Gruppe).

Das Verhalten ist wie folgt:

  • Zuerst, bevor irgendetwas anderes gemacht wird, ermittelt Typ und Berechtigungen von from durch nicht mehr als einen einzigen Aufruf von
  • Falls erforderlich, erhält den Status von to , durch nicht mehr als einen einzigen Aufruf von
  • Wenn entweder from oder to einen implementierungsdefinierten Dateityp hat, sind die Auswirkungen dieser Funktion implementierungsdefiniert.
  • Wenn from nicht existiert, wird ein Fehler gemeldet.
  • Wenn from und to dieselbe Datei sind, wie durch std::filesystem::equivalent bestimmt, wird ein Fehler gemeldet.
  • Wenn entweder from oder to keine reguläre Datei, kein Verzeichnis und keine symbolische Verknüpfung ist, wie durch std::filesystem::is_other bestimmt, wird ein Fehler gemeldet.
  • Wenn from ein Verzeichnis ist, aber to eine reguläre Datei ist, wird ein Fehler gemeldet.
  • Wenn from eine symbolische Verknüpfung ist, dann
  • Wenn copy_options::skip_symlink in options vorhanden ist, tut nichts.
  • Andernfalls, wenn to nicht existiert und copy_options::copy_symlinks in options vorhanden ist, verhält sich wie copy_symlink ( from, to ) .
  • Andernfalls wird ein Fehler gemeldet.
  • Andernfalls, wenn from eine reguläre Datei ist, dann
  • Wenn copy_options::directories_only in options vorhanden ist, wird nichts unternommen.
  • Andernfalls, wenn copy_options::create_symlinks in options vorhanden ist, wird eine symbolische Verknüpfung zu to erstellt. Hinweis: from muss ein absoluter Pfad sein, es sei denn, to befindet sich im aktuellen Verzeichnis.
  • Andernfalls, wenn copy_options::create_hard_links in options vorhanden ist, wird eine feste Verknüpfung zu to erstellt.
  • Andernfalls, wenn to ein Verzeichnis ist, verhält es sich wie copy_file ( from, to / from. filename ( ) , options ) (erstellt eine Kopie von from als Datei im Verzeichnis to ).
  • Andernfalls verhält es sich wie copy_file ( from, to, options ) (kopiert die Datei).
  • Andernfalls, falls from ein Verzeichnis ist und copy_options::create_symlinks in options gesetzt ist, wird ein Fehler mit einem Fehlercode gleich std:: make_error_code ( std:: errc :: is_a_directory ) gemeldet.
  • Andernfalls, falls from ein Verzeichnis ist und entweder options copy_options::recursive enthält oder copy_options::none ist,
  • Falls to nicht existiert, wird zuerst create_directory ( to, from ) ausgeführt (erstellt das neue Verzeichnis mit einer Kopie der Attribute des alten Verzeichnisses).
  • Dann, unabhängig davon ob to bereits existierte oder gerade erstellt wurde, iteriert über die in from enthaltenen Dateien, als ob durch for ( const std:: filesystem :: directory_entry & x : std:: filesystem :: directory_iterator ( from ) ) , und ruft für jeden Verzeichniseintrag rekursiv copy ( x. path ( ) , to / x. path ( ) . filename ( ) , options | in - recursive - copy ) auf, wobei in-recursive-copy ein spezielles Bit ist, das keine andere Wirkung hat, wenn es in options gesetzt ist. (Der einzige Zweck der Setzung dieses Bits ist, rekursives Kopieren von Unterverzeichnissen zu verhindern, falls options gleich copy_options::none ist.)
  • Andernfalls tut nichts.

Inhaltsverzeichnis

Parameter

from - Pfad zur Quelldatei, zum Verzeichnis oder zur symbolischen Verknüpfung
to - Pfad zur Zieldatei, zum Verzeichnis oder zur symbolischen Verknüpfung
ec - Out-Parameter für Fehlerberichterstattung in der nicht-werfenden Überladung

Rückgabewert

(keine)

Ausnahmen

Jede Überladung, die nicht als noexcept gekennzeichnet ist, kann std::bad_alloc auslösen, wenn die Speicherallokation fehlschlägt.

1,3) Wirft std::filesystem::filesystem_error bei zugrundeliegenden OS-API-Fehlern, konstruiert mit from als erstem Pfadargument, to als zweitem Pfadargument und dem OS-Fehlercode als Fehlercode-Argument.
2,4) Setzt einen std:: error_code & Parameter auf den OS-API-Fehlercode, wenn ein OS-API-Aufruf fehlschlägt, und führt ec. clear ( ) aus, falls keine Fehler auftreten.

Hinweise

Das Standardverhalten beim Kopieren von Verzeichnissen ist das nicht-rekursive Kopieren: Die Dateien werden kopiert, aber nicht die Unterverzeichnisse:

// Gegeben
// /dir1 enthält /dir1/file1, /dir1/file2, /dir1/dir2
// und /dir1/dir2 enthält /dir1/dir2/file3
// Nach
std::filesystem::copy("/dir1", "/dir3");
// /dir3 wird erstellt (mit den Attributen von /dir1)
// /dir1/file1 wird nach /dir3/file1 kopiert
// /dir1/file2 wird nach /dir3/file2 kopiert

Während mit copy_options::recursive die Unterverzeichnisse ebenfalls kopiert werden, inklusive ihres Inhalts, rekursiv.

// ...aber nach
std::filesystem::copy("/dir1", "/dir3", std::filesystem::copy_options::recursive);
// /dir3 wird erstellt (mit den Attributen von /dir1)
// /dir1/file1 wird nach /dir3/file1 kopiert
// /dir1/file2 wird nach /dir3/file2 kopiert
// /dir3/dir2 wird erstellt (mit den Attributen von /dir1/dir2)
// /dir1/dir2/file3 wird nach /dir3/dir2/file3 kopiert

Beispiel

#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"); // Datei kopieren
    fs::copy("sandbox/dir", "sandbox/dir2"); // Verzeichnis kopieren (nicht rekursiv)
    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");
}

Mögliche Ausgabe:

.
├── sandbox
│   ├── dir
│   │   └── subdir
│   ├── dir2
│   ├── file1.txt
│   └── file2.txt
└── sandbox_copy
    ├── dir
    │   └── subdir
    └── dir2
8 Verzeichnisse, 2 Dateien

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3013 C++17 error_code Überladung als noexcept markiert, kann aber Speicher allozieren noexcept entfernt
LWG 2682 C++17 Versuch, einen Symlink für ein Verzeichnis zu erstellen, gelingt, tut aber nichts meldet einen Fehler

Siehe auch

legt die Semantik von Kopiervorgängen fest
(enum)
kopiert einen symbolischen Link
(function)
(C++17)
kopiert Dateiinhalte
(function)