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
std::filesystem::rename: Redenumește sau mută un fișier sau un director.std::filesystem::remove: Șterge un fișier sau un director gol; remove_all șterge un director cu tot conținutul lui.std::filesystem::exists: Verifică dacă un fișier sau director există pe disc.std::copy: Copiază elementele unui interval (copy) sau primele n elemente (copy_n) la o destinație.