fs::write în Rust

Scrie tot conținutul dat într-un fișier, creându-l dacă nu există și înlocuindu-l dacă există.

Sintaxă
pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> io::Result<()>

Ce face fs::write

fs::write(cale, continut) creează fișierul (sau îl golește dacă există deja), scrie conținutul și îl închide. Conținutul poate fi text (&str, String) sau octeți (&[u8], Vec<u8>).

Pentru a adăuga la sfârșitul unui fișier fără să-l ștergi, folosește OpenOptions cu append(true). Pentru multe scrieri mici, un BufWriter peste un File este mai eficient. Directorul în care scrii trebuie să existe.

Parametri

Parametru Descriere
path Calea fișierului.
contents Textul sau octeții de scris.

Ce returnează

io::Result<()>.

Exemple

Exemplul 1: Scrierea unui raport

Construim textul cu format! și îl scriem dintr-odată. A doua scriere înlocuiește complet conținutul.

use std::fs;
use std::io;

fn main() -> io::Result<()> {
    let produse = [("pâine", 5.0), ("lapte", 7.5), ("cafea", 24.9)];
    let mut raport = String::from("produs,pret\n");
    for (nume, pret) in produse {
        raport += &format!("{nume},{pret:.2}\n");
    }
    fs::write("raport.csv", &raport)?;
    print!("{}", fs::read_to_string("raport.csv")?);

    fs::write("raport.csv", "gol\n")?;
    print!("după a doua scriere: {}", fs::read_to_string("raport.csv")?);
    Ok(())
}

Rezultat

produs,pret
pâine,5.00
lapte,7.50
cafea,24.90
după a doua scriere: gol

Exemplul 2: Scriere de octeți și eroare pentru director inexistent

use std::fs;

fn main() {
    let octeti: Vec<u8> = vec![0x52, 0x75, 0x73, 0x74];
    fs::write("date.bin", &octeti).unwrap();
    println!("date.bin: {:?}", fs::read("date.bin").unwrap());

    if let Err(e) = fs::write("nu_exista/fisier.txt", "text") {
        println!("eroare: {e}");
    }
}

Rezultat

date.bin: [82, 117, 115, 116]
eroare: No such file or directory (os error 2)

Greșeli frecvente

  • Ignori rezultatul: fs::write("a.txt", "x"); dă avertismentul unused_must_use. Folosește ? sau tratează eroarea.
  • Te aștepți ca fs::write să adauge la final: suprascrie tot. Pentru adăugare folosește OpenOptions::new().append(true).
  • Scrii într-un director care nu există: eroarea NotFound. Creează-l înainte cu fs::create_dir_all.

Comenzi înrudite

  • fs::read_to_string: Citește tot conținutul unui fișier text într-un String, dintr-un singur apel.
  • OpenOptions: Deschide un fișier cu opțiuni alese: adăugare la final, creare dacă lipsește, doar dacă nu există etc.
  • io::BufWriter: Adaugă un buffer peste orice scriitor: strânge scrierile mici și le trimite în bucăți mari, mult mai rapid.
  • fs::create_dir_all: Creează un director împreună cu toți părinții lui care lipsesc; nu dă eroare dacă directorul există deja.