filepath.Rel în Go

Calculează calea relativă care duce de la directorul basepath la targpath.

Sintaxă
func Rel(basepath, targpath string) (string, error)

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 Rel ca să verifici că o cale e în interiorul unui director, dar ignori rezultatul care începe cu ... Verifică cu filepath.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ă.