path/filepath 包涉及到路径操作时,路径分隔符使用 os.PathSeparator。不同系统,路径表示方式有所不同,比如 Unix 和 Windows 差别很大。本包能够处理所有的文件路径,不管是什么系统。
注意,路径操作函数并不会校验路径是否真实存在。
目录
path
path实现了对斜杠分隔的路径的实用操作函数。
相对路径和绝对路径
func IsAbs
func IsAbs(path string) bool
返回路径是否是一个绝对路径。
func Abs
func Abs(path string) (string, error)
Abs函数返回path代表的绝对路径
路径的切分和拼接
func Split
func Split(path string) (dir, file string)
Split函数将路径从最后一个斜杠后面位置分隔为两个部分(dir和file)并返回。如果路径中没有斜杠,函数返回值dir会设为空字符串,file会设为path。两个返回值满足path == dir+file。
func Join
func Join(elem ...string) string
Join函数可以将任意数量的路径元素放入一个单一路径里,会根据需要添加斜杠。结果是经过简化的,所有的空字符串元素会被忽略。
func SplitList
func SplitList(path string) []string
有时,我们需要分割 PATH 或 GOPATH 之类的环境变量(这些路径被特定于 OS 的列表分隔符连接起来),filepath.SplitList 就是这个用途:
与 strings.Split 函数的不同之处是:对 ""
,SplitList 返回[]string{}
,而 strings.Split 返回 []string{""}
。SplitList 内部调用的是 strings.Split。
解析路径名字符串
-
Dir() 和 Base() 函数将一个路径名字符串分解成目录和文件名两部分。
-
比如,给定路径名 /home/polaris/studygolang.go,Dir 返回 /home/polaris,而 Base 返回 studygolang.go。
func Dir
func Dir(path string) string
返回所在的目录。
func Base
func Base(path string) string
Base函数返回路径的最后一个元素。
func Ext
func Ext(path string) string
Ext函数返回path文件扩展名。
规整化路径
func Clean
Clean 函数通过单纯的词法操作返回和 path 代表同一地址的最短路径。
func Clean(path string) string
它会不断的依次应用如下的规则,直到不能再进行任何处理:
- 将连续的多个路径分隔符替换为单个路径分隔符
- 剔除每一个 . 路径名元素(代表当前目录)
- 剔除每一个路径内的 … 路径名元素(代表父目录)和它前面的非 … 路径名元素
- 剔除开始于根路径的 … 路径名元素,即将路径开始处的 /… 替换为 /(假设路径分隔符是 /)
文件路径匹配
func Match
func Match(pattern, name string) (matched bool, err error)
Match 指示 name 是否和 shell 的文件模式匹配
pattern:
{ term }
term:
'*' 匹配 0 或多个非路径分隔符的字符
'?' 匹配 1 个非路径分隔符的字符
'[' [ '^' ] { character-range } ']'
字符组(必须非空)
c 匹配字符 c(c != '*', '?', '\\', '[')
'\\' c 匹配字符 c
character-range:
c 匹配字符 c(c != '\\', '-', ']')
'\\' c 匹配字符 c
lo '-' hi 匹配区间[lo, hi]内的字符
遍历目录
func Walk
func Walk(root string, walkFn WalkFunc) error
Walk 函数会遍历 root 指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用 walkFn,包括 root 自身。
获取当前路径
- os.Getwd()`获取当前目录的绝对路径
_, filename, _, ok := runtime.Caller(0)
获取调用的文件
总结
-
path 包提供了对
/
分隔的路径的实用操作函数,filepath包实现了兼容各操作系统的文件路径的实用操作函数。 -
在 Unix 中,路径的分隔符是
/
,但 Windows 是\
。在使用 path 包时,应该总是使用/
,不论什么系统。 -
path 包中提供的函数,filepath 都有提供,功能类似,但实现不同。
-
一般应该总是使用 filepath 包,而不是 path 包。