os.MkdirAll în Go

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

Sintaxă
func MkdirAll(path string, perm FileMode) error

Ce face os.MkdirAll

os.MkdirAll este echivalentul comenzii mkdir -p. Creează fiecare director din cale care încă nu există. Dacă tot drumul există deja, returnează nil, fără eroare.

Este funcția potrivită înainte de a scrie un fișier într-un director care s-ar putea să nu existe: os.MkdirAll("date/2025", 0o755), apoi os.WriteFile("date/2025/raport.txt", ...).

Dă eroare doar dacă o parte din cale este un fișier obișnuit (nu un director) sau dacă nu ai drepturi.

Parametri

Parametru Descriere
path Calea completă a directorului.
perm Drepturile pentru directoarele create, de obicei 0o755.

Ce returnează

nil dacă directorul există la final, altfel eroarea.

Exemple

Exemplul 1: O structură de proiect

package main

import (
    "fmt"
    "os"
)

func main() {
    for _, d := range []string{"proiect/cmd/server", "proiect/intern/baza", "proiect/web/static"} {
        if err := os.MkdirAll(d, 0o755); err != nil {
            fmt.Println("eroare:", err)
            return
        }
    }
    intrari, _ := os.ReadDir("proiect")
    for _, e := range intrari {
        fmt.Println("proiect/" + e.Name())
    }
}

Rezultat

proiect/cmd
proiect/intern
proiect/web

Exemplul 2: Apelul repetat nu dă eroare

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("prima dată:", os.MkdirAll("cache/imagini", 0o755))
    fmt.Println("a doua oară:", os.MkdirAll("cache/imagini", 0o755))
}

Rezultat

prima dată: <nil>
a doua oară: <nil>

Exemplul 3: O parte din cale este fișier

note.txt este un fișier, deci nu poate conține directorul arhiva.

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("note.txt", []byte("Ana 9\n"), 0o644)
    err := os.MkdirAll("note.txt/arhiva", 0o755)
    fmt.Println("eroare:", err)
}

Rezultat

eroare: mkdir note.txt: not a directory

Greșeli frecvente

  • Folosești MkdirAll și te aștepți la eroare când directorul există. Nu primești; dacă trebuie să știi că directorul e nou, folosește os.Mkdir.
  • Construiești calea cu + "/" +. Folosește filepath.Join, care pune separatorul corect pe fiecare sistem.

Comenzi înrudite

  • os.Mkdir: Creează un singur director nou; dă eroare dacă există deja sau dacă directorul părinte lipsește.
  • os.WriteFile: Scrie octeții dați într-un fișier: îl creează dacă lipsește și îi înlocuiește conținutul dacă există.
  • filepath.Join: Unește mai multe bucăți într-o cale, cu separatorul corect al sistemului, și curăță rezultatul.
  • os.RemoveAll: Șterge un fișier sau un director cu tot conținutul lui; nu dă eroare dacă nu există.