参考资料
- https://studygolang.com/pkgdoc
- http://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter06/06.2.html
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
的相对路径,不过前提是basepath
和targpath
必须都是相对路径,若其中有一个是绝对路径则会返回错误。
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()
函数会将任意数量的路径元素拼接为一个单一路径,并根据情况添加路径分隔符。典型的应用场景,比如对系统环境变量path
或GOPATH
之类的环境变量来拼接。