fs::copy în Rust

Copiază conținutul unui fișier în altul (îl creează sau îl suprascrie) și returnează numărul de octeți copiați.

Sintaxă
pub fn copy<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> io::Result<u64>

Ce face fs::copy

fs::copy(sursa, destinatie) copiază fișierul și permisiunile lui. Dacă destinația există, este suprascrisă. Returnează câți octeți au fost copiați.

Funcția copiază doar fișiere, nu directoare întregi; pentru un director trebuie să parcurgi conținutul cu read_dir și să copiezi fiecare fișier. Directorul destinației trebuie să existe.

Parametri

Parametru Descriere
from Fișierul sursă.
to Calea copiei.

Ce returnează

io::Result<u64>: numărul de octeți copiați.

Exemple

Exemplul 1: Copie de siguranță

use std::fs;

fn main() -> std::io::Result<()> {
    fs::write("setari.ini", "tema=intunecata\nlimba=ro\n")?;
    fs::create_dir_all("backup")?;

    let octeti = fs::copy("setari.ini", "backup/setari.ini")?;
    println!("am copiat {octeti} octeți");

    fs::write("setari.ini", "tema=luminoasa\n")?;
    print!("original: {}", fs::read_to_string("setari.ini")?);
    print!("copie:    {}", fs::read_to_string("backup/setari.ini")?.lines().next().unwrap_or(""));
    println!();
    Ok(())
}

Rezultat

am copiat 25 octeți
original: tema=luminoasa
copie:    tema=intunecata

Exemplul 2: Erori la copiere

use std::fs;

fn main() {
    println!("sursă lipsă: {:?}", fs::copy("nu_exista.txt", "copie.txt").map_err(|e| e.kind()));

    fs::create_dir_all("dosar").unwrap();
    println!("director ca sursă: {:?}", fs::copy("dosar", "dosar2").is_err());
}

Rezultat

sursă lipsă: Err(NotFound)
director ca sursă: true

Greșeli frecvente

  • Încerci să copiezi un director cu fs::copy: dă eroare. Copiază fișierele unul câte unul.
  • Copiezi peste un fișier important fără să verifici: destinația este suprascrisă fără întrebare.

Comenzi înrudite

  • fs::rename: Redenumește sau mută un fișier ori un director; destinația existentă este înlocuită.
  • fs::read_dir: Listează intrările (fișiere și directoare) dintr-un director, ca iterator de DirEntry.
  • fs::write: Scrie tot conținutul dat într-un fișier, creându-l dacă nu există și înlocuindu-l dacă există.