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șteos.Mkdir. - Construiești calea cu
+ "/" +. Foloseștefilepath.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ă.