std::filesystem::copy în C++

Copiază fișiere și directoare; cu copy_options::recursive copiază un director cu tot conținutul.

Sintaxă
void copy(const path& sursa, const path& destinatie, copy_options optiuni = copy_options::none);
bool copy_file(const path& sursa, const path& destinatie, copy_options optiuni = copy_options::none);

Ce face std::filesystem::copy

copy(sursa, destinatie) copiază un fișier sau, pentru directoare, doar fișierele de pe primul nivel. Cu opțiunea std::filesystem::copy_options::recursive copiază tot arborele de directoare.

Dacă destinația există deja, implicit se aruncă filesystem_error. Opțiunile overwrite_existing, skip_existing și update_existing schimbă acest comportament; se pot combina cu |.

copy_file copiază un singur fișier și returnează true dacă a copiat ceva.

Parametri

Parametru Descriere
sursa Ce se copiază.
destinatie Unde se copiază.
optiuni Combinație de copy_options (recursive, overwrite_existing, skip_existing…).

Ce returnează

copy: nimic. copy_file: true dacă fișierul a fost copiat.

Exemple

Exemplul 1: Copie de siguranță pentru un fișier

#include <filesystem>
#include <fstream>
#include <print>

int main() {
    namespace fs = std::filesystem;
    std::ofstream("date.csv") << "nume,oras\nAna,Iași\n";

    fs::copy_file("date.csv", "date.bak");
    std::println("copie: {} octeți", fs::file_size("date.bak"));

    bool copiat = fs::copy_file("date.csv", "date.bak", fs::copy_options::skip_existing);
    std::println("a doua copiere (skip_existing): {}", copiat);

    fs::copy_file("date.csv", "date.bak", fs::copy_options::overwrite_existing);
    std::println("suprascris cu overwrite_existing");

    fs::remove("date.csv");
    fs::remove("date.bak");
}

Rezultat

copie: 20 octeți
a doua copiere (skip_existing): false
suprascris cu overwrite_existing

Exemplul 2: Copierea unui director întreg

#include <filesystem>
#include <fstream>
#include <print>

int main() {
    namespace fs = std::filesystem;
    fs::create_directories("site/css");
    std::ofstream("site/index.html") << "<h1>Salut</h1>";
    std::ofstream("site/css/stil.css") << "h1{}";

    fs::copy("site", "backup", fs::copy_options::recursive);

    std::println("backup/index.html: {}", fs::exists("backup/index.html"));
    std::println("backup/css/stil.css: {}", fs::exists("backup/css/stil.css"));

    fs::remove_all("site");
    fs::remove_all("backup");
}

Rezultat

backup/index.html: true
backup/css/stil.css: true

Greșeli frecvente

  • Copiezi un director fără copy_options::recursive și te miri că subdirectoarele lipsesc. Implicit se copiază doar fișierele de pe primul nivel.

Comenzi înrudite