File în Rust

Un fișier deschis: File::open îl deschide pentru citire, File::create îl creează (sau golește) pentru scriere.

Sintaxă
use std::fs::File;

fn open<P: AsRef<Path>>(path: P) -> io::Result<File>    // doar citire
fn create<P: AsRef<Path>>(path: P) -> io::Result<File>  // scriere, golește fișierul

Ce face File

File reprezintă un fișier deschis. File::open(cale) îl deschide doar pentru citire și dă eroare dacă nu există. File::create(cale) îl deschide pentru scriere: îl creează dacă lipsește și îl golește dacă există.

Citirea și scrierea se fac prin trait-urile std::io::Read și std::io::Write, care trebuie importate (use std::io::{Read, Write};). Pentru citire linie cu linie îl împachetezi într-un BufReader, iar pentru multe scrieri mici într-un BufWriter.

Fișierul se închide automat când variabila File iese din domeniu. Pentru alte moduri de deschidere (adăugare la final, creare doar dacă nu există) folosește File::options().

Parametri

Parametru Descriere
path Calea fișierului.

Ce returnează

io::Result<File>.

Exemple

Exemplul 1: Scriere cu create, citire cu open

use std::fs::File;
use std::io::{Read, Write};

fn main() -> std::io::Result<()> {
    let mut f = File::create("cumparaturi.txt")?;
    writeln!(f, "lapte")?;
    writeln!(f, "pâine")?;
    f.write_all("ouă\n".as_bytes())?;
    drop(f);

    let mut text = String::new();
    File::open("cumparaturi.txt")?.read_to_string(&mut text)?;
    print!("{text}");
    Ok(())
}

Rezultat

lapte
pâine
ouă

Exemplul 2: Erori tipice

open pe un fișier lipsă dă NotFound; scrierea într-un fișier deschis cu open eșuează, pentru că e doar pentru citire.

use std::fs::{self, File};
use std::io::Write;

fn main() {
    println!("open lipsă: {:?}", File::open("lipsa.txt").map_err(|e| e.kind()));

    fs::write("citire.txt", "abc").unwrap();
    let mut f = File::open("citire.txt").unwrap();
    println!("scriere în fișier deschis pentru citire: {}", f.write_all(b"x").is_err());
}

Rezultat

open lipsă: Err(NotFound)
scriere în fișier deschis pentru citire: true

Greșeli frecvente

  • Uiți use std::io::Write sau Read: eroarea no method named `write_all` found. Metodele vin din trait-uri.
  • Deschizi cu File::create un fișier la care voiai să adaugi: conținutul vechi este șters. Folosește File::options().append(true).open(...).
  • Faci multe write mici direct pe File: fiecare este un apel de sistem. Pune un BufWriter în față.

Comenzi înrudite

  • OpenOptions: Deschide un fișier cu opțiuni alese: adăugare la final, creare dacă lipsește, doar dacă nu există etc.
  • io::BufReader: Adaugă un buffer peste orice cititor (de obicei un File): citiri mai rapide și acces la metodele BufRead.
  • io::BufWriter: Adaugă un buffer peste orice scriitor: strânge scrierile mici și le trimite în bucăți mari, mult mai rapid.
  • io::Read: Trait-ul oricărei surse de octeți (fișier, stdin, rețea): read_to_string și read_to_end citesc tot ce a rămas.
  • io::Write: Trait-ul oricărei destinații de octeți: write_all scrie tot bufferul, flush golește memoria tampon; permite write!.
  • File::sync_all: Forțează scrierea datelor și a metadatelor fișierului pe disc, nu doar în memoria tampon a sistemului.