filepath包是维护文件名和路径的工具。
扩展名package main
import (
"fmt"
"path/filepath"
)
func main() {
fmt.Printf("No dots: %q\n", filepath.Ext("index")) //
fmt.Printf("One dot: %q\n", filepath.Ext("index.js")) // .js
fmt.Printf("Two dots: %q\n", filepath.Ext("main.test.js")) // .js
}
获取目录最底层目录或文件
package main
import (
"fmt"
"path/filepath"
)
func main() {
fmt.Println(filepath.Base("/foo/bar/baz.js")) // baz.js
fmt.Println(filepath.Base("/foo/bar/baz")) // baz
fmt.Println(filepath.Base("/foo/bar/baz/")) // baz
fmt.Println(filepath.Base("dev.txt")) // dev.txt
fmt.Println(filepath.Base("../todo.txt")) // todo.txt
fmt.Println(filepath.Base("..")) // ..
fmt.Println(filepath.Base(".")) // .
fmt.Println(filepath.Base("/")) // \
fmt.Println(filepath.Base("")) // .
}
获取父路径
package main
import (
"fmt"
"path/filepath"
)
func main() {
fmt.Println(filepath.Dir("/foo/bar/baz.js")) // \foo\bar
fmt.Println(filepath.Dir("/foo/bar/baz")) // \foo\bar
fmt.Println(filepath.Dir("/foo/bar/baz/")) // \foo\bar\baz
fmt.Println(filepath.Dir("/dirty//path///")) // \dirty\path
fmt.Println(filepath.Dir("dev.txt")) // .
fmt.Println(filepath.Dir("../todo.txt")) // ..
fmt.Println(filepath.Dir("..")) // .
fmt.Println(filepath.Dir(".")) // .
fmt.Println(filepath.Dir("/")) // \
fmt.Println(filepath.Dir("")) // .
}
判断是否是绝对路径
package main
import (
"fmt"
"path/filepath"
)
func main() {
fmt.Println(filepath.IsAbs("D:\\a.txt")) // true
fmt.Println(filepath.IsAbs(".bashrc")) // false
fmt.Println(filepath.IsAbs("..")) // false
fmt.Println(filepath.IsAbs(".")) // false
fmt.Println(filepath.IsAbs("/")) // false
fmt.Println(filepath.IsAbs("")) // false
}
合并路径
package main
import (
"fmt"
"path/filepath"
)
func main() {
fmt.Println(filepath.Join("a", "b", "c")) // a\b\c
fmt.Println(filepath.Join("a", "b/c")) // a\b\c
fmt.Println(filepath.Join("a/b", "c")) // a\b\c
fmt.Println(filepath.Join("a/b", "/c")) // a\b\c
fmt.Println(filepath.Join("a/b", "../../../xyz")) // ..\xyz
}
获取相对路径
package main
import (
"fmt"
"path/filepath"
)
func main() {
paths := []string{
"/a/b/c",
"/b/c",
"./b/c",
}
base := "/a"
rel, _ := filepath.Rel(base, paths[0])
fmt.Println(rel) // b\c
rel, _ = filepath.Rel(base, paths[1])
fmt.Println(rel) // ..\b\c
rel, _ = filepath.Rel(base, paths[2])
fmt.Println(rel) // 失败
}
多个目录分割
package main
import (
"fmt"
"path/filepath"
)
func main() {
paths := filepath.SplitList("/a/b/c;/usr/bin")
fmt.Println(paths[0]) // /a/b/c
fmt.Println(paths[1]) // /usr/bin
}
参考