Пакетът filepath предоставя функции за разбор и построяване на пѫтеки до
файлове по начин, който е преносим между различните работни уредби1,
папка/файл на Линукс или папка\файл на Уиндоус.import (
"fmt"
"path/filepath"
"strings"
)
func main() {
Функцията Join (съединявам) е предназнаена за съставяне на пѫтеки по
преносим начин. Тя приема неограничен брой податки и съставя иерархична
пѫтека от тях.
p := filepath.Join("папка", "подпапка", "именафайл.txt")
fmt.Println("p:", p)
Винаги използвайте Join вместо да съставяте пѫтеката „на ръка”, като
ползвате / или \. Освен че предоставя преносимост, Join
нормализира пѫтеките, като премахва излишните разделители и промените в
пѫтя до папките, което води до повишена сигурност.
fmt.Println(filepath.Join("папка//", "именафайл"))
fmt.Println(filepath.Join("папка/../папка", "именафайл"))
Функциите Dir и Base могат да се ползват за разделяне на пѫтека на
папка и файл. Отделно можете да ползвате Split, за да върнете и двете
части с едно извикване.
fmt.Println("Dir(p):", filepath.Dir(p))
fmt.Println("Base(p):", filepath.Base(p))
d, f := filepath.Split(p)
fmt.Printf("Split(p): %s, %s\n", d, f)
Можем да проверяваме, дали даден пѫт е абсолютен.
fmt.Println(filepath.IsAbs("dir/file"))
fmt.Println(filepath.IsAbs("/dir/file"))
filename := filepath.Base(p)
Някои имена на файлове имат разширение. Можем да вземем разширението с
помощта на функцията Ext (от extension – разширение).
ext := filepath.Ext(filename)
fmt.Println(ext)
За да вземем само името на файла, можем да ползваме
strings.TrimSuffix.
fmt.Println(strings.TrimSuffix(filename, ext))
Rel (от relative – относителен) открива относителен пѫт при подадени
основа и цел и връща относителният пѫт до целта. Ако целта не може
да бъде съотнесена към основата (сиреч, не може да бъде относителен път
за тази основа), връща празен низ и грешка.
rel, err := filepath.Rel("ала/бала", "ала/бала/ница/файл")
if err != nil {
panic(err)
}
fmt.Println(rel)
rel, err = filepath.Rel("a/b", "a/c/t/file")
if err != nil {
panic(err)
}
fmt.Println(rel)
}
$ go run file-paths.go
p: папка/подпапка/именафайл.txt
папка/именафайл
папка/именафайл
Dir(p): папка/подпапка
Base(p): именафайл.txt
Split(p): папка/подпапка/, именафайл.txt
false
true
.txt
именафайл
ница/файл
../c/t/file
Следващ пример: Папки.