os
包提供了平台无关的操作系统功能接口,其错误处理采用的是UNIX
风格的设计。
os:系统功能实现
os
包的接口规定实现在所有操作系统中都是一致的。有一些系统特定的功能,需要使用syscall
来进行获取。但在实际编程中,我们应该总是优先使用os
中提供的功能,而不是syscall
。
我们来看一个简单的例子:
file, err := os.Open("file.go")
if err != nil {
log.Fatal(err)
}
如果文件打开失败,错误字符串时能够描述原因的。
因此os
包为我们提供了很大的便捷,接下来我们一起来看一下具体都有哪些内容。
path:兼容路径操作
path/filepath
包涉及路径操作时,路径分隔符使用os.PathSeparator
,虽然我们知道不同的操作系统之间的路径表示方式有很大的区别,但是Path
包能够处理所有的文件路径,不管是什么系统。
解析路径名字符串
Dir()
和Base()
函数将一个路径名字符串分解成目录和文件名两部分。定义如下:
func Dir(path string) string
func Base(path string) string
Dir()
函数返回的是路径中除去最后一个路径元素的部分,即该路径最后一个元素所在的目录。在使用Splirt
去掉最后一个元素后,会简化路径并去掉末尾的斜杠。如果路径是空字符串,则会返回'.'
。
Base()
函数则返回的是路径的最后一个元素。在提取元素前会抹掉末尾的'/'
,如果路径为空,则会返回'.'
。
除了这两个比较常用的之外,还有一个函数时Ext()
函数,它返回的是path
的文件扩展名。扩展名是路径中最后一个从'.'
开始的部分,它是包括'.'
的。
相对路径和绝对路径
绝对路径,在UNIX
中以'/'
开始,在Windows
中以某个盘符开始。
IsAbs()
函数就可以用来判断返回的路径是否是一个绝对路径。
func IsAbs(path string) bool
而函数Abs()
则返回的是path
代表的绝对路径,如果不是绝对路径,则会添加当前工作目录以使之成为绝对路径。
func Abs(path string) (string, error)
而Rel()
函数返回的则是一个相对路径,将basepath
和该路径用路径分隔符连起来的新路径在词法上等价于targpath
:
func Rel(basepath, targpath string) (string, error)
路径的切分和拼接
我们对于路径的切分,使用Split()
函数来获取它的目录路径和文件名:
func Split(path string) (dir, file string)
具体的规则用几个简单的例子来说明一下:
// dir : /home/hdc file : text
filepath.Split("/home/hdc/text")
// dir : /home/hdc/text/ file : ""
filepath.Split("home/hdc/text/")
// dir : "" file : text
filepath.Split("text")
相对路径到绝对路径的转变,需要经过路径的拼接。Join
函数就是用来将多个路径拼接起来的函数。
func Join(elem ...string) string
这个函数可以将任意数量的路径元素放入一个单一的路径里,会根据需求添加路径分隔符。而且对于路径拼接的需求,应该总是使用Join
函数来进行处理。
规整化路径
Clean()
函数通过单纯的词法操作返回和path
代表同一地址的最短路径。
func Clean(path string) string
它会依据以下规则不断执行函数,直到函数中的path
不需要再做任何处理为止。
1)将连续的多个路径分隔符替换为单个路径分隔符;
2)剔除每一个'.'
路径名元素(代表的是当前目录);
3)剔除每一个'..'
路径名元素(代表父目录)和它前面的非'..'
路径名元素;
4)剔除开始于根路径的'..'
路径名元素,即将路径开始处的'/..'
替换为'/'
;
文件路径匹配
Match()
指示name
是否和shell
的文件模式匹配,语法如下:
func Match(pattern, name string) (matched bool, err error)
Match
函数很少被用到,标准库中也没有用到这个函数。而Glob
函数在模板标准库中被用到了:
func Glob(pattern string) (matches []string, err error)
Glob
函数返回了所有匹配了模式字符串pattern
的文件列表或者nil
。其返回的结果是根据文件名字典顺序进行了排序的。
遍历目录
在filepath
中,提供了Walk()
函数,用于遍历目录树。
func Walk(root string, walkFn WalkFunc) error
Walk()
函数会遍历root
指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用walkFn
,包括root
自身。walkFn
的类型WalkFunc
的定义如下:
type WalkFunc func(path string, info os.FileInfo, err error) error
Walk()
函数对每一个文件/目录都会调用WalkFunc()
函数类型值,调用时path
参数会包含Walk()
的root
参数作为前缀。walkFn
参数被调用时的info
参数是path
指定的地址的文件信息,类型为os.FileInfo
。
最后还有一点需要注意的是:在UNIX
中,路径的分隔符是'/'
,但Windows
中的是'\'
,在使用path
包时,应该总是使用'/'
,不论是什么系统。
path
包中提供的函数在filepath
中也存在,但实现可能会不同,我们以后在使用的过程中一般应该使用filepath
包,而不是path
包。
网友评论