fs::read în Rust

Citește tot conținutul unui fișier ca octeți (Vec<u8>), fără să ceară ca textul să fie UTF-8.

Sintaxă
pub fn read<P: AsRef<Path>>(path: P) -> io::Result<Vec<u8>>

Ce face fs::read

fs::read este varianta pentru date binare a lui read_to_string: returnează toți octeții fișierului într-un Vec<u8>. Merge pentru orice fișier: imagini, arhive, text în altă codificare.

Dacă vrei totuși text, poți încerca String::from_utf8(octeti) (dă eroare la octeți invalizi) sau String::from_utf8_lossy(&octeti) (înlocuiește octeții invalizi cu �).

Parametri

Parametru Descriere
path Calea fișierului.

Ce returnează

io::Result<Vec<u8>>.

Exemple

Exemplul 1: Octeții unui fișier text

Literele cu diacritice ocupă câte doi octeți în UTF-8, deci Iași are 5 octeți.

use std::fs;

fn main() -> std::io::Result<()> {
    fs::write("oras.txt", "Iași")?;
    let octeti = fs::read("oras.txt")?;
    println!("{} octeți: {:?}", octeti.len(), octeti);
    println!("în hexazecimal: {:02X?}", octeti);
    Ok(())
}

Rezultat

5 octeți: [73, 97, 200, 153, 105]
în hexazecimal: [49, 61, C8, 99, 69]

Exemplul 2: Recunoașterea tipului de fișier după primii octeți

Fișierele PNG încep cu octeții 89 50 4E 47. Creăm un fișier fals cu acest început și îl verificăm.

use std::fs;

fn tip_fisier(octeti: &[u8]) -> &'static str {
    if octeti.starts_with(&[0x89, b'P', b'N', b'G']) {
        "imagine PNG"
    } else if octeti.starts_with(b"%PDF") {
        "document PDF"
    } else {
        "necunoscut"
    }
}

fn main() -> std::io::Result<()> {
    fs::write("poza.png", [0x89, b'P', b'N', b'G', 13, 10, 26, 10])?;
    fs::write("act.pdf", b"%PDF-1.7 ...")?;
    fs::write("note.txt", "Ana 10")?;

    for nume in ["poza.png", "act.pdf", "note.txt"] {
        let octeti = fs::read(nume)?;
        println!("{nume}: {} ({} octeți)", tip_fisier(&octeti), octeti.len());
    }
    let text = String::from_utf8_lossy(&fs::read("note.txt")?).into_owned();
    println!("note.txt ca text: {text}");
    Ok(())
}

Rezultat

poza.png: imagine PNG (8 octeți)
act.pdf: document PDF (12 octeți)
note.txt: necunoscut (6 octeți)
note.txt ca text: Ana 10

Greșeli frecvente

  • Citești cu fs::read fișiere de câțiva GB: totul ajunge în memorie. Citește în bucăți cu File și read.

Comenzi înrudite

  • fs::read_to_string: Citește tot conținutul unui fișier text într-un String, dintr-un singur apel.
  • fs::write: Scrie tot conținutul dat într-un fișier, creându-l dacă nu există și înlocuindu-l dacă există.
  • 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.
  • u8: Întreg fără semn pe 8 biți (0-255): tipul unui octet, folosit pentru date binare și text ASCII/UTF-8.