path/filepath

参考资料

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)
入参数据类型描述
skipint需要提升的堆栈帧数,0表示当前函数,1表示上一层函数。
返回值数据类型描述
pcuintptr返回的函数指针
filestring函数所在文件名的目录
lineint当前所在行号
okbool是否可以获取信息

返回值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)
返回值文件类型描述
dirstring当前进程的工作目录,即当前文件路径。
errerror错误信息

相对路径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之类的环境变量来拼接。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值