Ce face filepath.Clean
filepath.Clean returnează cea mai scurtă cale echivalentă, aplicând reguli pur textuale: înlocuiește separatoarele multiple cu unul, elimină elementele ., elimină perechile dir/.., elimină .. de la începutul unei căi absolute și separatorul de la final. O cale goală devine ".".
Funcția nu consultă discul, deci nu știe de legături simbolice: link/.. poate să nu fie același lucru cu . dacă link arată în altă parte. Pentru calea reală folosește filepath.EvalSymlinks.
Parametri
| Parametru | Descriere |
|---|---|
path |
Calea de simplificat. |
Ce returnează
Calea simplificată.
Exemple
Exemplul 1: Simplificări
package main
import (
"fmt"
"path/filepath"
)
func main() {
for _, c := range []string{
"date//2025///raport.csv",
"./proiect/./src/",
"proiect/src/../docs",
"/../../etc/hosts",
"../../poze",
"",
} {
fmt.Printf("%-26q -> %q\n", c, filepath.Clean(c))
}
}
Rezultat
"date//2025///raport.csv" -> "date/2025/raport.csv"
"./proiect/./src/" -> "proiect/src"
"proiect/src/../docs" -> "proiect/docs"
"/../../etc/hosts" -> "/etc/hosts"
"../../poze" -> "../../poze"
"" -> "."
Exemplul 2: Compararea a două căi
package main
import (
"fmt"
"path/filepath"
)
func main() {
a := "proiect/src/../src/main.go"
b := "./proiect//src/main.go"
fmt.Println("ca text:", a == b)
fmt.Println("după Clean:", filepath.Clean(a) == filepath.Clean(b))
}
Rezultat
ca text: false
după Clean: true
Greșeli frecvente
- Crezi că
Cleanface o cale sigură.Clean("../../etc")rămâne../../etc; foloseștefilepath.IsLocalpentru verificare.
Comenzi înrudite
filepath.Join: Unește mai multe bucăți într-o cale, cu separatorul corect al sistemului, și curăță rezultatul.filepath.Abs: Transformă o cale relativă în cale absolută, pornind de la directorul curent.filepath.EvalSymlinks: Returnează calea reală, după ce urmează toate legăturile simbolice din ea.filepath.IsLocal: Spune dacă o cale rămâne în interiorul directorului curent: nu e absolută, nu e goală și nu urcă cu „..”.