注册 登录

清河洛

Go中的路径操作

qingheluo2024-07-09清河洛328
在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 WalkF...

在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返回去除最后一个元素的目录路径


网址导航