Namensräume
Varianten
Aktionen

std::filesystem::copy_file

Von cppreference.com
 
 
 
Definiert in Header <filesystem>
bool copy_file( const std::filesystem::path& from,
                const std::filesystem::path& to );
(1) (seit C++17)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,

                std::error_code& ec );
(2) (seit C++17)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,

                std::filesystem::copy_options options );
(3) (seit C++17)
bool copy_file( const std::filesystem::path& from,

                const std::filesystem::path& to,
                std::filesystem::copy_options options,

                std::error_code& ec );
(4) (seit C++17)
1,2) Die Standardeinstellung, äquivalent zu (3,4) mit `copy_options::none` als options.
3,4) Kopiert eine einzelne Datei von from nach to unter Verwendung der von options angegebenen Kopieroptionen. Das Verhalten ist undefiniert, wenn mehr als eine Option in einer der copy_options-Gruppen in options vorhanden ist (auch in Gruppen, die für filesystem::copy_file nicht relevant sind).
  • Wenn !filesystem::is_regular_file(from) (entweder weil die Quelldatei nicht existiert oder weil es sich nicht um eine reguläre Datei handelt), wird ein Fehler gemeldet.
  • Andernfalls, wenn die Zieldatei nicht existiert,
  • kopiert den Inhalt und die Attribute der Datei, auf die from verweist, in die Datei, auf die to verweist (Symlinks werden verfolgt).
  • Andernfalls, wenn die Zieldatei bereits existiert,
  • meldet einen Fehler, wenn eine der folgenden Bedingungen zutrifft:
  • Andernfalls, wenn `copy_options::skip_existing` in options gesetzt ist, tue nichts.
  • Andernfalls, wenn `copy_options::overwrite_existing` in options gesetzt ist, kopiere den Inhalt und die Attribute der Datei, auf die from verweist, in die Datei, auf die to verweist.
  • Andernfalls, wenn `copy_options::update_existing` in options gesetzt ist, kopiere die Datei nur, wenn from neuer ist als to, wie durch filesystem::last_write_time() definiert.

Die nicht-werfenden Überladungen geben false zurück, wenn ein Fehler auftritt.

Inhalt

[edit] Parameter

from - Pfad zur Quelldatei
to - Pfad zur Zieldatei
ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[edit] Rückgabewert

true, wenn die Datei kopiert wurde, false andernfalls.

[edit] Ausnahmen

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

1,3) Wirft std::filesystem::filesystem_error bei zugrundeliegenden Betriebssystem-API-Fehlern, konstruiert mit from als erstem Pfadargument, to als zweitem Pfadargument und dem Betriebssystem-Fehlercode als Fehlercodeargument.
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, wenn keine Fehler auftreten.

[edit] Hinweise

Die Funktionen beinhalten höchstens einen direkten oder indirekten Aufruf von filesystem::status(to) (verwendet, um festzustellen, ob die Datei existiert, und für die Option `filesystem::copy_options::update_existing`, deren letzte Schreibzeit).

Fehler wird gemeldet, wenn filesystem::copy_file zum Kopieren eines Verzeichnisses verwendet wird: Verwenden Sie stattdessen filesystem::copy.

filesystem::copy_file folgt Symlinks: Verwenden Sie stattdessen filesystem::copy_symlink oder filesystem::copy mit `filesystem::copy_options::copy_symlinks`.

[edit] Beispiel

#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file1.txt").put('a');
 
    fs::copy_file("sandbox/file1.txt", "sandbox/file2.txt");
 
    // now there are two files in sandbox:
    std::cout << "file1.txt holds: "
              << std::ifstream("sandbox/file1.txt").rdbuf() << '\n';
    std::cout << "file2.txt holds: "
              << std::ifstream("sandbox/file2.txt").rdbuf() << '\n';
 
    // fail to copy directory
    fs::create_directory("sandbox/abc");
    try
    {
        fs::copy_file("sandbox/abc", "sandbox/def");
    }
    catch (fs::filesystem_error& e)
    {
        std::cout << "Could not copy sandbox/abc: " << e.what() << '\n';
    }
    fs::remove_all("sandbox");
}

Mögliche Ausgabe

file1.txt holds: a
file2.txt holds: a
Could not copy sandbox/abc: copy_file: Is a directory: "sandbox/abc", "sandbox/def"

[edit] 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 3014 C++17 error_code-Überladung als noexcept markiert, kann aber Speicher allokieren noexcept entfernt

[edit] Siehe auch

spezifiziert die Semantik von Kopiervorgängen
(Enum) [bearbeiten]
kopiert einen symbolischen Link
(Funktion) [bearbeiten]
(C++17)
kopiert Dateien oder Verzeichnisse
(Funktion) [bearbeiten]