Go中的路径操作
在Go语言中,path和path/filepath两个包都用于处理路径
path/filepath包是基于path包做了拓展,增加了很多新的方法和类型用于更精细的路径操作
更重要的是path包的路径分割采用的是POSIX标准,这个标准在不同的系统不同的版本中的支持并不相同,会存在跨平台后的兼容问题,而path/filepath包则是基于os包来选择路径分隔符,提供了很好的跨平台兼容性
所以实际使用中,我们更经常使用的是path/filepath包
类型
type WalkFunc func(path string, info os.FileInfo, err error) error
WalkFunc是一个函数类型,用于递归遍历一个目录中的所有目录和文件,每一个目录或文件都会使用该函数进行一次操作
该函数接受三个参数
1、此次处理的目录或文件的字符串格式的路径 2、此次处理的目录或文件的文件信息 3、打开此次处理的目录或文件(用于获取第二个参数信息)时的错误信息
相关函数
Walk(root string, fn WalkFunc) error WalkDir(root string, fn fs.WalkDirFunc) error 遍历以root为根的文件树,为树中的每个文件或目录(包括root)调用fn 两个函数功能完全相同WalkDir是在1.16版本之后才加入进来的,避免了对访问过的文件或目录调用os.Lstat,提高了效率 当fn返回filepath.SkipAll预定义错误时,会结束后续所有的遍历操作 当fn返回filepath.SkipDir预定义错误时,会跳过当前操作的目录继续进行后续的遍历操作 实测返回filepath.SkipDir也会结束遍历,不知道是测试代码有问题还是bug
导出函数
逻辑判断相关
IsAbs(path string) bool
IsLocal(path string) bool
满足一下4个条件及返回true,否则返回false 1、是一个相对目录 2、不是空字符串 3、位于当前程序根目录的子目录中 4、在windows上,不是保留名称,如"NUL" IsLocal是一个纯字符串操作,没有考虑文件系统中可能存在的任何符号链接的影响
路径分割相关
Base(path string) string :返回path的最后一个元素
在操作之前会先删除尾部的路径分隔符 如果path为空字符串,返回"." 如果path只由斜杠组成,返回单个路径分隔符
Dir(path string) string :返回path的最后一个元素所在目录
其实就是path在去除最后Base(path)字符串后的字符串 返回时会删除末尾的路径分隔符 如果path为空字符串,返回"."
Split(path string) (dir, file string)
返回path从最后一个路径分隔符分割后的路径和文件名 如果path中没有路径分隔符,返回dir为空字符串,file为path
SplitList(path string) []string
将path用操作系统特定的表分隔符分割 windows中为";",linux中为":" path为空字符串时返回一个空切片([]string{})
Ext(path string) string :返回文件拓展名
返回路径最后一个元素的最后一个'.'起始的后缀(包括'.') 如果该元素没有'.'会返回空字符串
路径转换相关
Abs(path string) (string, error) :返回表示path的绝对路径
Clean(path string) string
返回与path表示同一个目录的最短字符串表达 如果path为空空字符串,返回"."
EvalSymlinks(path string) (string, error)
返回一个符号链接所指向的路径 如果path是相对的,则结果将相对于当前目录,并调用Clean
FromSlash(path string) string
将path中的斜杠('/')替换为路径分隔符并返回替换结果 多个斜杠会替换为多个路径分隔符
ToSlash(path string) string :返回将path中的每个分隔符替换为斜杠(“/”)字符的结果
Localize(path string) (string, error) :将一个路径中的目录分隔符转换为当前系统的路径分隔符
Join(elem ...string) string
将任意数量的路径元素连接到单个路径中,并使用操作系统特定的分隔符将它们分隔开 空元素将被忽略
Rel(basepath, targpath string) (string, error)
返回相对于basepath的targpath的相对路径表达 如果两个参数一个是相对路径而另一个是绝对路径,或者targpath无法表示为相对于basepath的路径,将返回错误
路径匹配相关
Match(pattern, path string) (matched bool, err error) :返回指定的path是否匹配pattern
Glob(pattern string) (matches []string, err error)
返回所有匹配pattern的文件名,如果没有匹配的文件,则返回nil
其他
VolumeName(path string) string
返回卷名 windows返回格式如"D:"、"C:" linux返回去除最后一个元素的目录路径