filepath.Clean în Go

Simplifică o cale: elimină separatoarele duble, „.” și rezolvă „..” doar din text, fără acces la disc.

Sintaxă
func Clean(path string) string

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ă Clean face o cale sigură. Clean("../../etc") rămâne ../../etc; folosește filepath.IsLocal pentru 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 „..”.