fs::metadata în Rust

Informații despre un fișier sau director: dimensiune, tip, permisiuni, data modificării.

Sintaxă
pub fn metadata<P: AsRef<Path>>(path: P) -> io::Result<Metadata>
fn File::metadata(&self) -> io::Result<Metadata>

Ce face fs::metadata

fs::metadata(cale) returnează un Metadata cu informații despre fișier, fără să-l deschidă. File::metadata(&f) face același lucru pentru un fișier deja deschis. Pe Metadata găsești len() (dimensiunea în octeți), is_file(), is_dir(), permissions().readonly() și modified() (data ultimei modificări, ca SystemTime).

Dacă fișierul nu există, primești eroarea NotFound. fs::metadata urmează legăturile simbolice; pentru informații despre legătura însăși există fs::symlink_metadata.

Parametri

Parametru Descriere
path Calea fișierului sau a directorului.

Ce returnează

io::Result<Metadata>.

Exemple

Exemplul 1: Dimensiune și tip

use std::fs;

fn main() -> std::io::Result<()> {
    fs::write("articol.md", "# Rust\nUn limbaj sigur și rapid.\n")?;
    fs::create_dir_all("imagini")?;

    for cale in ["articol.md", "imagini"] {
        let m = fs::metadata(cale)?;
        println!("{cale}: fișier = {}, director = {}", m.is_file(), m.is_dir());
    }
    println!("articol.md are {} octeți", fs::metadata("articol.md")?.len());
    println!("doar citire: {}", fs::metadata("articol.md")?.permissions().readonly());
    println!("lipsa.txt: {:?}", fs::metadata("lipsa.txt").map_err(|e| e.kind()));
    Ok(())
}

Rezultat

articol.md: fișier = true, director = false
imagini: fișier = false, director = true
articol.md are 34 octeți
doar citire: false
lipsa.txt: Err(NotFound)

Exemplul 2: File::metadata și data modificării

Dimensiunea crește după ce scriem în fișierul deschis. Data modificării este cea de acum, deci verificăm doar că s-a putut citi.

use std::fs::File;
use std::io::Write;

fn main() -> std::io::Result<()> {
    let mut f = File::create("jurnal.txt")?;
    println!("la creare: {} octeți", f.metadata()?.len());

    writeln!(f, "pornire server")?;
    println!("după scriere: {} octeți", f.metadata()?.len());

    let modificat = f.metadata()?.modified();
    println!("data modificării disponibilă: {}", modificat.is_ok());
    Ok(())
}

Rezultat

la creare: 0 octeți
după scriere: 15 octeți
data modificării disponibilă: true

Greșeli frecvente

  • Folosești metadata().is_ok() ca să verifici dacă un fișier există și apoi îl deschizi: între cele două pași fișierul poate dispărea. Deschide-l direct și tratează eroarea.
  • Crezi că len() pe un director dă dimensiunea conținutului: este dimensiunea intrării de director în sistemul de fișiere, nu suma fișierelor.

Comenzi înrudite

  • fs::read_dir: Listează intrările (fișiere și directoare) dintr-un director, ca iterator de DirEntry.
  • Path::exists: Întreabă sistemul dacă la cale există ceva (exists), dacă este un fișier (is_file) sau un director (is_dir).
  • SystemTime: Ora sistemului (ceasul din calendar); diferența față de UNIX_EPOCH dă timestamp-ul Unix în secunde.
  • File: Un fișier deschis: File::open îl deschide pentru citire, File::create îl creează (sau golește) pentru scriere.