1. 概述说明
import "path/filepath"
filepath
包实现了兼容各操作系统的文件路径的实用操作函数。
2. 主要函数
2.1 func IsAbs
func IsAbs(path string) bool
IsAbs
返回路径是否是一个绝对路径。
2.2 func Abs
func Abs(path string) (string, error)
Abs
函数返回 path
代表的绝对路径,如果 path
不是绝对路径,会加入当前工作目录以使之成为绝对路径。因为硬链接的存在,不能保证返回的绝对路径是唯一指向该地址的绝对路径。
2.3 func Rel
func Rel(basepath, targpath string) (string, error)
Rel
函数返回一个相对路径,将 basepath
和该路径用路径分隔符连起来的新路径在词法上等价于 targpath
。也就是说, Join(basepath, Rel(basepath, targpath))
等价于 targpath
本身。如果成功执行,返回值总是相对于 basepath
的,即使 basepath
和 targpath
没有共享的路径元素。如果两个参数一个是相对路径而另一个是绝对路径,或者 targpath
无法表示为相对于 basepath
的路径,将返回错误。
2.4 func SplitList
func SplitList(path string) []string
将 PATH
或 GOPATH
等环境变量里的多个路径分割开(这些路径被 OS 特定的表分隔符连接起来)。
与 strings.Split
函数的不同之处是:
- 对
""
,SplitList
返回[]string{}
,而strings.Split
返回[]string{""}
。
2.5 func Split
func Split(path string) (dir, file string)
Split
函数将路径从最后一个路径分隔符后面位置分隔为两个部分( dir
和 file
)并返回。如果路径中没有路径分隔符,函数返回值 dir
会设为空字符串, file
会设为 path
。两个返回值满足 path == dir+file
。
2.6 func Join
func Join(elem ...string) string
Join
函数可以将任意数量的路径元素放入一个单一路径里,会根据需要添加路径分隔符。结果是经过简化的,所有的空字符串元素会被忽略。
2.7 func FromSlash
func FromSlash(path string) string
FromSlash
函数将 path
中的斜杠( /
)替换为路径分隔符并返回替换结果,多个斜杠会替换为多个路径分隔符。
2.8 func ToSlash
func ToSlash(path string) string
ToSlash
函数将 path
中的路径分隔符替换为斜杠( /
)并返回替换结果,多个路径分隔符会替换为多个斜杠。
2.9 func VolumeName
func VolumeName(path string) (v string)
VolumeName
函数返回最前面的卷名。
- 如 Windows 系统里提供参数"C:\foo\bar"会返回"C:";
- Unix/linux系统的"\host\share\foo"会返回"\host\share";其他平台会返回"";
2.10 func Dir
func Dir(path string) string
Dir
返回路径除去最后一个路径元素的部分,即该路径最后一个元素所在的目录。在使用 Split
去掉最后一个元素后,会简化路径并去掉末尾的斜杠。如果路径是空字符串,会返回 .
;如果路径由 1 到多个路径分隔符后跟 0 到多个非路径分隔符字符组成,会返回单个路径分隔符;其他任何情况下都不会返回以路径分隔符结尾的路径。
2.11 func Base
func Base(path string) string
Base
函数返回路径的最后一个元素。在提取元素前会求掉末尾的路径分隔符。如果路径是"",会返回".";如果路径是只有一个斜杆构成,会返回单个路径分隔符。
2.12 func Ext
func Ext(path string) string
Ext
函数返回 path
文件扩展名。返回值是路径最后一个路径元素的最后一个 .
起始的后缀(包括 .
)。如果该元素没有 .
会返回空字符串。
2.13 func Clean
func Clean(path string) string
Clean
函数通过单纯的词法操作返回和 path
代表同一地址的最短路径。
它会不断的依次应用如下的规则,直到不能再进行任何处理:
- 将连续的多个路径分隔符替换为单个路径分隔符
- 剔除每一个
.
路径名元素(代表当前目录) - 剔除每一个路径内的
..
路径名元素(代表父目录)和它前面的非..
路径名元素 - 剔除开始一个根路径的
..
路径名元素,即将路径开始处的/..
替换为/
(假设路径分隔符是/
)
返回的路径只有其代表一个根地址时才以路径分隔符结尾,如Unix的 /
或Windows的C:\
。
如果处理的结果是空字符串,Clean会返回 .
。
2.14 func EvalSymlinks
func EvalSymlinks(path string) (string, error)
EvalSymlinks
函数返回 path
指向的符号链接(软链接)所包含的路径。如果 path
和返回值都是相对路径,会相对于当前目录;除非两个路径其中一个是绝对路径。
2.15 func Match
func Match(pattern, name string) (matched bool, err error)
如果 name
匹配 shell
文件名模式匹配字符串, Match
函数返回真。该模式匹配字符串语法为:
pattern:
{ term }
term:
'*' 匹配0或多个非路径分隔符的字符
'?' 匹配1个非路径分隔符的字符
'[' [ '^' ] { character-range } ']' 字符组(必须非空)
c 匹配字符c(c != '*', '?', '\', '[')
'\' c 匹配字符c
character-range:
c 匹配字符c(c != '\', '-', ']')
'\' c 匹配字符c
lo '-' hi 匹配区间[lo, hi]内的字符
Match
要求匹配整个 name
字符串,而不是它的一部分。只有 pattern
语法错误时,会返回 ErrBadPattern
。
Windows系统中,不能进行转义:’'被视为路径分隔符。
2.16 func Glob
func Glob(pattern string) (matches []string, err error)
Glob
函数返回所有匹配模式匹配字符串 pattern
的文件或者 nil
(如果没有匹配的文件)。 pattern
的语法和 Match
函数相同。 pattern
可以描述多层的名字,如 /usr/*/bin/ed
(假设路径分隔符是 /
)。
2.17 type WalkFunc
type WalkFunc func(path string, info os.FileInfo, err error) error
Walk
函数对每一个文件 /
目录都会调用 WalkFunc
函数类型值。调用时 path
参数会包含 Walk
的 root
参数作为前缀;就是说,如果 Walk
函数的 root
为 dir
,该目录下有文件 a
,将会使用 dir/a
调用 walkFn
参数。 walkFn
参数被调用时的 info
参数是 path
指定的地址(文件/目录)的文件信息,类型为 os.FileInfo
。
- 如果遍历
path
指定的文件或目录时出现了问题,传入的参数err
会描述该问题,WalkFunc
类型函数可以决定如何去处理该错误(Walk
函数将不会深入该目录); - 如果该函数返回一个错误,
Walk
函数的执行会中止; - 只有一个例外,如果
Walk
的walkFn
返回值是SkipDir
,将会跳过该目录的内容而Walk
函数照常执行处理下一个文件。
2.18 func Walk
func Walk(root string, walkFn WalkFunc) error
Walk
函数会遍历 root
指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用 walkFn
,包括 root
自身。所有访问文件 /
目录时遇到的错误都会传递给 walkFn
过滤。文件是按词法顺序遍历的,这让输出更漂亮,但也导致处理非常大的目录时效率会降低。
Walk
函数不会遍历文件树中的符号链接(快捷方式)文件包含的路径。
3. 示例代码
func main() {
// 判断是否为绝对路径
absFlag := filepath.IsAbs("/home/wohu/GoCode/src/task") // true
// 获取所给路径的绝对路径
absPath, _ := filepath.Abs("./") // /home/wohu/GoCode
// 返回以 basepath 为基准的相对路径
relPath, _ := filepath.Rel("/home/wohu/GoCode/src", "/home/wohu/GoCode/src/task") // task
// 将路径使用路径列表分隔符分开,见os.PathListSeparator
splitList := filepath.SplitList("/home/wohu/GoCode:/usr/local/go:")
// []string{"/home/wohu/GoCode", "/usr/local/go", ""}
// 分割路径中的目录和文件
dir, file := filepath.Split("/home/wohu/GoCode/src/main.go")
// dir is "/home/wohu/GoCode/src/", file is "main.go"
// 连接路径,返回已经clean过的路径
joinPath := filepath.Join("/home", "wohu", "GoCode", "src", "..") // joinPath is /home/wohu/GoCode
// 将路径中的 / 替换为路径分隔符
fromSlash := filepath.FromSlash("/home/wohu/GoCode/src") // /home/wohu/GoCode/src
// 将路径分隔符使用/替换
fmt.Println(filepath.ToSlash("/home/wohu/GoCode/src"))
/*
FromSlash、ToSlash 在跨平台使用时比较方便,例如将 Windows 代码移植到 Linux
*/
// 返回分区名
fmt.Println(filepath.VolumeName("/home/wohu/GoCode/src"))
// 返回最后一个元素所在目录
fmt.Println(filepath.Dir("/home/wohu/GoCode/src/main.go")) // /home/wohu/GoCode/src
// 返回路径的最后一个元素
fmt.Println(filepath.Base("/home/wohu/GoCode/src/main.go")) // main.go
// 返回路径最后文件的扩展名
fmt.Println(filepath.Ext("/home/wohu/GoCode/src/main.go")) // .go
// 返回等价最短路径
fmt.Println(filepath.Clean("/home/wohu/GoCode/../GoCode/src/main.go"))
// /home/wohu/GoCode/src/main.go
//返回链接文件的实际路径
path2, _ := filepath.EvalSymlinks("1.lnk")
fmt.Println(path2)
//匹配文件名,完全匹配则返回true
fmt.Println(filepath.Match("*", "a")) // true <nil>
fmt.Println(filepath.Match("*", "C:/a/b/c")) // false <nil>
fmt.Println(filepath.Match("\\b", "b")) // true <nil>
//返回所有匹配的文件
match, _ := filepath.Glob("/home/wohu/GoCode/src/task/*.txt")
fmt.Println(match)
// [/home/wohu/GoCode/src/task/test.txt /home/wohu/GoCode/src/task/test_bak.txt]
//遍历指定目录下所有文件
filepath.Walk("/home/wohu/GoCode/src/task/", func(path string, info os.FileInfo, err error) error {
fmt.Println(path)
return nil
})
fmt.Println("absFlag is ", absFlag)
fmt.Println("absPath is ", absPath)
fmt.Println("relPath is ", relPath)
fmt.Printf("splitList %#v\n", splitList)
fmt.Printf("dir is %#v, file is %#v\n", dir, file)
fmt.Println("joinPath is ", joinPath)
fmt.Println("fromSlash is ", fromSlash)
}
参考:
https://studygolang.com/static/pkgdoc/pkg/path_filepath.htm
https://www.cnblogs.com/jkko123/p/6923962.html