Ce face filepath.Rel
filepath.Rel răspunde la întrebarea „cum ajung din basepath la targpath?”. Rezultatul îndeplinește regula Join(basepath, rezultat) == Clean(targpath). Poate conține .. dacă trebuie să urci în director.
Ambele căi trebuie să fie de același fel (ambele absolute sau ambele relative); altfel primești eroare. Calculul este pur textual, fără acces la disc.
Parametri
| Parametru | Descriere |
|---|---|
basepath |
Directorul de plecare. |
targpath |
Destinația. |
Ce returnează
Calea relativă și nil, sau o eroare.
Exemple
Exemplul 1: Căi relative
package main
import (
"fmt"
"path/filepath"
)
func main() {
perechi := [][2]string{
{"/srv/site", "/srv/site/css/stil.css"},
{"/srv/site/blog", "/srv/site/imagini/logo.png"},
{"/srv/site", "/srv/site"},
{"proiect", "/tmp/fisier"},
}
for _, p := range perechi {
rel, err := filepath.Rel(p[0], p[1])
fmt.Printf("%-16s -> %-28s = %q %v\n", p[0], p[1], rel, err)
}
}
Rezultat
/srv/site -> /srv/site/css/stil.css = "css/stil.css" <nil>
/srv/site/blog -> /srv/site/imagini/logo.png = "../imagini/logo.png" <nil>
/srv/site -> /srv/site = "." <nil>
proiect -> /tmp/fisier = "" Rel: can't make /tmp/fisier relative to proiect
Exemplul 2: Listă de fișiere relativă la proiect
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
os.MkdirAll("proiect/cmd/server", 0o755)
os.MkdirAll("proiect/web", 0o755)
os.WriteFile("proiect/cmd/server/main.go", nil, 0o644)
os.WriteFile("proiect/web/index.html", nil, 0o644)
filepath.WalkDir("proiect", func(cale string, d os.DirEntry, err error) error {
if !d.IsDir() {
rel, _ := filepath.Rel("proiect", cale)
fmt.Println(rel)
}
return nil
})
}
Rezultat
cmd/server/main.go
web/index.html
Greșeli frecvente
- Amesteci o cale absolută cu una relativă. Transformă-le întâi pe amândouă cu
filepath.Abs. - Folosești
Relca să verifici că o cale e în interiorul unui director, dar ignori rezultatul care începe cu... Verifică cufilepath.IsLocal(rel).
Comenzi înrudite
filepath.Abs: Transformă o cale relativă în cale absolută, pornind de la directorul curent.filepath.Join: Unește mai multe bucăți într-o cale, cu separatorul corect al sistemului, și curăță rezultatul.filepath.IsLocal: Spune dacă o cale rămâne în interiorul directorului curent: nu e absolută, nu e goală și nu urcă cu „..”.filepath.WalkDir: Parcurge recursiv un director și apelează o funcție pentru fiecare fișier și subdirector, în ordine alfabetică.