Go в примери: Файлови пѫтища

Пакетът filepath предоставя функции за разбор и построяване на пѫтеки до файлове по начин, който е преносим между различните работни уредби1,


  1. operating system – работна уредба, операционна система, като например папка/файл на Линукс или папка\файл на Уиндоус.
package main
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

Следващ пример: .