Files and Directories
Path Join and Clean
path.Join and path.Clean build predictable slash-separated paths from pieces.
path handling
Path helpers avoid hand-building separators and normalize redundant path pieces.
Path Join and Clean
path_join_clean.go
Replay: real traced execution (multi-file project)
package main
import (
"fmt"
"path"
)
func main() {
var folder = "reports"
joined := path.Join("data", folder, "today.txt")
messy := "data/" + folder + "/../" + folder + "/today.txt"
cleaned := path.Clean(messy)
fmt.Println("folder=", folder)
fmt.Println("joined=", joined)
fmt.Println("cleaned=", cleaned)
fmt.Println("same=", joined == cleaned)
}
package main
import (
"fmt"
"path"
)
func main() {
var folder = "logs"
joined := path.Join("data", folder, "today.txt")
messy := "data/" + folder + "/../" + folder + "/today.txt"
cleaned := path.Clean(messy)
fmt.Println("folder=", folder)
fmt.Println("joined=", joined)
fmt.Println("cleaned=", cleaned)
fmt.Println("same=", joined == cleaned)
}
package main
import (
"fmt"
"path"
)
func main() {
var folder = "archive"
joined := path.Join("data", folder, "today.txt")
messy := "data/" + folder + "/../" + folder + "/today.txt"
cleaned := path.Clean(messy)
fmt.Println("folder=", folder)
fmt.Println("joined=", joined)
fmt.Println("cleaned=", cleaned)
fmt.Println("same=", joined == cleaned)
}
folder ← "reports", joined ← "data/reports/today.txt", messy ← "data/reports/../reports/today.txt"
8func main() {9 var folder→ "reports" = "reports" //@folder="logs", "archive"10 joined→ "data/reports/today.txt" := path.Join("data", folder"reports", "today.txt")11 messy→ "data/reports/../reports/today.txt" := "data/" + folder"reports" + "/../" + folder + "/today.txt"12 cleaned→ "data/reports/today.txt" := path.Clean(messy"data/reports/../reports/today.txt")1314 fmt.Println("folder=", folder"reports")15 fmt.Println("joined=", joined"data/reports/today.txt")16 fmt.Println("cleaned=", cleaned"data/reports/today.txt")17 fmt.Println("same=", joined"data/reports/today.txt" == cleaned"data/reports/today.txt")18}outputfolder= reports joined= data/reports/today.txt cleaned= data/reports/today.txt same= true
folder ← "logs", joined ← "data/logs/today.txt", messy ← "data/logs/../logs/today.txt"
8func main() {9 var folder→ "logs" = "logs"10 joined→ "data/logs/today.txt" := path.Join("data", folder"logs", "today.txt")11 messy→ "data/logs/../logs/today.txt" := "data/" + folder"logs" + "/../" + folder + "/today.txt"12 cleaned→ "data/logs/today.txt" := path.Clean(messy"data/logs/../logs/today.txt")1314 fmt.Println("folder=", folder"logs")15 fmt.Println("joined=", joined"data/logs/today.txt")16 fmt.Println("cleaned=", cleaned"data/logs/today.txt")17 fmt.Println("same=", joined"data/logs/today.txt" == cleaned"data/logs/today.txt")18}outputfolder= logs joined= data/logs/today.txt cleaned= data/logs/today.txt same= true
folder ← "archive", joined ← "data/archive/today.txt", messy ← "data/archive/../archive/today.txt"
8func main() {9 var folder→ "archive" = "archive"10 joined→ "data/archive/today.txt" := path.Join("data", folder"archive", "today.txt")11 messy→ "data/archive/../archive/today.txt" := "data/" + folder"archive" + "/../" + folder + "/today.txt"12 cleaned→ "data/archive/today.txt" := path.Clean(messy"data/archive/../archive/today.txt")1314 fmt.Println("folder=", folder"archive")15 fmt.Println("joined=", joined"data/archive/today.txt")16 fmt.Println("cleaned=", cleaned"data/archive/today.txt")17 fmt.Println("same=", joined"data/archive/today.txt" == cleaned"data/archive/today.txt")18}outputfolder= archive joined= data/archive/today.txt cleaned= data/archive/today.txt same= true