fs::create_dir_all în Rust

Creează un director împreună cu toți părinții lui care lipsesc; nu dă eroare dacă directorul există deja.

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

Ce face fs::create_dir_all

fs::create_dir_all("date/2026/octombrie") creează pe rând date, date/2026 și date/2026/octombrie, dacă nu există. Dacă tot drumul există deja, funcția reușește fără să facă nimic, deci o poți apela fără verificări.

Varianta fs::create_dir creează un singur director și dă eroare (AlreadyExists) dacă există deja sau NotFound dacă părintele lipsește.

Parametri

Parametru Descriere
path Calea directorului de creat.

Ce returnează

io::Result<()>.

Exemple

Exemplul 1: Structură de directoare pentru rapoarte

use std::fs;
use std::path::Path;

fn main() -> std::io::Result<()> {
    fs::create_dir_all("rapoarte/2026/octombrie")?;
    fs::write("rapoarte/2026/octombrie/vanzari.csv", "zi,total\n1,1200\n")?;

    println!("director creat: {}", Path::new("rapoarte/2026/octombrie").is_dir());
    println!("a doua oară: {:?}", fs::create_dir_all("rapoarte/2026/octombrie"));
    print!("{}", fs::read_to_string("rapoarte/2026/octombrie/vanzari.csv")?);
    Ok(())
}

Rezultat

director creat: true
a doua oară: Ok(())
zi,total
1,1200

Exemplul 2: Diferența față de create_dir

use std::fs;

fn main() {
    println!("create_dir a/b: {:?}", fs::create_dir("a/b").map_err(|e| e.kind()));
    println!("create_dir a:   {:?}", fs::create_dir("a").map_err(|e| e.kind()));
    println!("din nou a:      {:?}", fs::create_dir("a").map_err(|e| e.kind()));
    println!("create_dir_all: {:?}", fs::create_dir_all("a/b/c").map_err(|e| e.kind()));
}

Rezultat

create_dir a/b: Err(NotFound)
create_dir a:   Ok(())
din nou a:      Err(AlreadyExists)
create_dir_all: Ok(())

Greșeli frecvente

  • Folosești create_dir pentru o cale cu mai multe niveluri noi: eroarea NotFound. Folosește create_dir_all.
  • Verifici întâi cu exists() și apoi creezi: între cele două pași alt program poate crea directorul. create_dir_all se descurcă singur cu directoarele existente.

Comenzi înrudite

  • fs::remove_file: remove_file șterge un fișier; remove_dir_all șterge un director cu tot conținutul lui. Ștergerea este definitivă.
  • 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).
  • fs::write: Scrie tot conținutul dat într-un fișier, creându-l dacă nu există și înlocuindu-l dacă există.