美文网首页
path/filepath

path/filepath

作者: JunChow520 | 来源:发表于2021-12-26 17:59 被阅读0次

参考资料

Golang内置path/filepath包实现了兼容各种操作系统文件路径的使用操作函数,简单来说path/filepath实现的是路径操作。

import "path/filepath"

路径分割符os.PathSeparator

操作系统典型的不同之处在于路径分隔符,Unix中路径分隔符为/,Windows中路径操作符为\。Golang内置的path包只兼容以/为路径分隔符的操作系统。因此出现了path/filepath路径操作包。

面对不同操作系统的文件分隔符,Golang提供的os.PathSeparator可在不同操作系统下实现兼容。因此实际使用时,应优先考虑path/filepath包,而非path包。

当前文件runtime.Caller

获取当前文件完整路径,同时包含文件名。

pc, file, line, ok := runtime.Caller(0)
fmt.Printf("pc = %d, file = %s, line = %d, ok = %t", pc, file, line, ok)
// pc = 11420885, file = d:/Go/Project/test/main.go, line = 9, ok = true

利用runtime.Call()函数可以获取当前文件的完整路径

runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool)
入参 数据类型 描述
skip int 需要提升的堆栈帧数,0表示当前函数,1表示上一层函数。
返回值 数据类型 描述
pc uintptr 返回的函数指针
file string 函数所在文件名的目录
line int 当前所在行号
ok bool 是否可以获取信息

返回值pc是一个uintptr类型的函数指针,可通过runtime.FuncForPC(pc).Name()获取当前函数的名称,注意返回的字符串格式为"文件名.函数名"。

fmt.Println(runtime.FuncForPC(pc).Name()) // main.main

返回值file则是当前文件的完整路径,其中包含文件名称本身。

当前路径os.Getwd

os.Getwd()函数用于返回当前进程的工作目录

func Getwd() (dir string, err error)
返回值 文件类型 描述
dir string 当前进程的工作目录,即当前文件路径。
err error 错误信息

相对路径filepath.Rel

每个进程都会存在当前工作目录,一般而言对于进程而言当前工作目录是相对路径,也就是针对当前工作目录而言的。当然也可以针对某个目录指定相对路径。

path/filepath包提供的Rel()函数可以返回一个相对路径

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

filepath.Rel()函数会以basepath作为基准,返回targpath相对于basepath的相对路径,不过前提是basepathtargpath必须都是相对路径,若其中有一个是绝对路径则会返回错误。

relpath := filepath.Rel("./a", "./a/b/c") # /b/c

绝对路径filepath.Abs

path/filepath包提供的Abs()函数会返回以入参path代表的绝对路径,若入参path并非绝对路径,则会加入当前工作目录使之转换为绝对路径。

func Abs(path string) (string, error)
  • 由于硬链接的存在,并不能保证Abs()返回的绝对路径是唯一指向该地址的绝对路径。
  • 当使用os.Getwd()获取当前工作目录出错时,Abs()函数也会返回错误。
  • 当路径名长度超过系统限制则时Abs()会返回错误

是否绝对路径filepath.IsAbs

在Unix操作系统下根路径是以/开始的,而在Windows中则是以某个盘符开始。那么如何判断一个路径是否是绝对路径呢?path/filepath包提供了IsAbs()函数,用来判断某个路径是否为绝对路径。

func IsAbs(path string) bool

上级路径filepath.Dir

func Dir(path string) string

filepath.Dir()函数会将一个路径名字字符串path分为目录和文件名两部分,它与Unix中的dirname类似,但若路径名字字符串path/结尾则返回结果会不一致。

pc, file, line, ok := runtime.Caller(0)
fmt.Printf("pc = %d, file = %s, line = %d, ok = %t\n", pc, file, line, ok)

fmt.Printf("%s\n", filepath.Dir(file)) // d:\Go\Project\test

filepath.Dir()返回结果的路径中会剔除最后一个路径元素部分,也就是说返回的是路径最后一个元素所在的目录。简单来说,filepath.Dir()用来获取路径名字字符串path中最后一个路径分隔符之前的部分,且不包含路径分隔符。

wd, _ := os.Getwd()
fmt.Println(wd) // d:\Go\Project\test

dir := filepath.Dir(wd)
fmt.Println(dir) // d:\Go\Project

若路径名称字符串path为空字符串则会返回.符号

dir := filepath.Dir("")
fmt.Println(dir) // .

基础路径filepath.Base

func Base(path string) string 
  • filepath.Base()函数会返回路径名称字符串path中的最后一个元素,即该路径指明的目录名或文件名。
_, file, _, _ := runtime.Caller(0)
fmt.Printf("%s\n", file)                // d:/Go/Project/test/main.go
fmt.Printf("%s\n", filepath.Base(file)) // main.go
wd, _ := os.Getwd()
fmt.Println(wd) //d:\Go\Project\test
fmt.Println(filepath.Base(wd)) // test
  • filepath.Base()在提取元素前会剔除末尾的路径分隔符。
  • 若路径字符串path为空字符串则返回.
  • 若路径字符串path是只是一个斜杠则会返回单个路径分隔符
fmt.Println(filepath.Base(""))   // .
fmt.Println(filepath.Base("/"))  // \
fmt.Println(filepath.Base("\\")) // \

文件扩展名filepath.Ext

func Ext(path string) string
  • filepath.Ext()函数可以返回文件名称字符串path中的文件扩展名,扩展名是路径中最后一个从.点号开始的部分,并包含.点号。
  • 若文件路径字符串path中没有.点号则返回空字符串
_, file, _, _ := runtime.Caller(0)
fmt.Printf("%s\n", file)               // d:/Go/Project/test/main.go
fmt.Printf("%s\n", filepath.Ext(file)) // .go

pwd, _ := os.Getwd()
fmt.Printf("%s\n", pwd)               // d:\Go\Project\test
fmt.Printf("%s\n", filepath.Ext(pwd)) // 空字符串

路径切分filepath.Split

filepath.Split()函数可针对一个常规文件路径拆分以获取目录路径和文件名称

_, file, _, _ := runtime.Caller(0)
fmt.Printf("%s\n", file) // d:/Go/Project/test/main.go

dir, file := filepath.Split(file)
fmt.Printf("%s\n", dir)  // d:/Go/Project/test/
fmt.Printf("%s\n", file) // main.go

filepath.Split()函数会根据路径字符串path中最后一个路径分隔符,将path分割为目录路径dir和文件名称file两部分

  • 若路径字符串path中没有路径分隔符则返回的目录路径dir为空字符串,此时file则等同于path
dir, file := filepath.Split("")
fmt.Printf("%s\n", dir)  // 空字符串
fmt.Printf("%s\n", file) // 空字符串
  • 若路径字符串path中最后一个字符是路径分隔符,则目录路径dir等同于路径字符串path,文件名称file为空字符串。
dir, file := filepath.Split("/")
fmt.Printf("%s\n", dir)  // /
fmt.Printf("%s\n", file) // 空字符串

路径拆分filepath.SplitList

func SplitList(path string) []string {
    return splitList(path)
}

路径拼接filepath.Join

filepath.Join()函数会将任意数量的路径元素拼接为一个单一路径,并根据情况添加路径分隔符。典型的应用场景,比如对系统环境变量pathGOPATH之类的环境变量来拼接。

相关文章

网友评论

      本文标题:path/filepath

      本文链接:https://www.haomeiwen.com/subject/wqtlqrtx.html