os.RemoveAll în Go

Șterge un fișier sau un director cu tot conținutul lui; nu dă eroare dacă nu există.

Sintaxă
func RemoveAll(path string) error

Ce face os.RemoveAll

os.RemoveAll este echivalentul comenzii rm -rf: șterge directorul împreună cu toate fișierele și subdirectoarele lui. Dacă calea nu există, returnează nil.

Funcția este periculoasă dacă calea vine din date nesigure sau e calculată greșit. Verifică întotdeauna calea înainte (să nu fie goală, să nu fie / sau directorul utilizatorului).

Parametri

Parametru Descriere
path Calea fișierului sau directorului de șters.

Ce returnează

nil dacă la final calea nu mai există, altfel prima eroare întâlnită.

Exemple

Exemplul 1: Ștergerea unui director întreg

package main

import (
    "fmt"
    "os"
)

func main() {
    os.MkdirAll("build/js/vendor", 0o755)
    os.WriteFile("build/index.html", []byte("<h1>Salut</h1>"), 0o644)
    os.WriteFile("build/js/app.js", []byte("console.log(1)"), 0o644)

    fmt.Println("RemoveAll:", os.RemoveAll("build"))
    _, err := os.Stat("build")
    fmt.Println("build există?", err == nil)
}

Rezultat

RemoveAll: <nil>
build există? false

Exemplul 2: Calea nu există: nicio eroare

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(os.RemoveAll("nu-exista"))
}

Rezultat

<nil>

Exemplul 3: Protecție înainte de ștergere

O funcție mică de siguranță refuză căile goale sau absolute înainte de RemoveAll.

package main

import (
    "errors"
    "fmt"
    "os"
    "path/filepath"
)

func curataDirector(cale string) error {
    if cale == "" || filepath.IsAbs(cale) || !filepath.IsLocal(cale) {
        return errors.New("cale refuzată: " + cale)
    }
    return os.RemoveAll(cale)
}

func main() {
    os.MkdirAll("temp/imagini", 0o755)
    fmt.Println(curataDirector("temp"))
    fmt.Println(curataDirector(""))
    fmt.Println(curataDirector("/"))
    fmt.Println(curataDirector("../alt-proiect"))
}

Rezultat

<nil>
cale refuzată: 
cale refuzată: /
cale refuzată: ../alt-proiect

Greșeli frecvente

  • Construiești calea din variabile care pot fi goale: os.RemoveAll(baza + "/" + nume) cu baza gol devine /nume. Verifică datele înainte.
  • Te bazezi pe eroare ca să afli dacă directorul exista. RemoveAll returnează nil și când nu exista nimic.

Comenzi înrudite

  • os.Remove: Șterge un fișier sau un director gol.
  • os.MkdirTemp: Creează un director temporar nou, cu nume unic, și returnează calea lui.
  • filepath.IsLocal: Spune dacă o cale rămâne în interiorul directorului curent: nu e absolută, nu e goală și nu urcă cu „..”.
  • os.MkdirAll: Creează un director împreună cu toți părinții care lipsesc; nu dă eroare dacă directorul există deja.