美文网首页Go语言实践Go
Go语言I/O编程(二)----文件系统

Go语言I/O编程(二)----文件系统

作者: 帅气的昵称都有人用了 | 来源:发表于2019-04-29 18:34 被阅读2次

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包。

相关文章

  • Go语言I/O编程(二)----文件系统

    os包提供了平台无关的操作系统功能接口,其错误处理采用的是UNIX风格的设计。 os:系统功能实现 os包的接口规...

  • Go入门系列(六)I/O

    目录:一、终端I/O二、文件I/O 一、终端I/O Go语言的终端I/O操作在基础包上有封装了多种,我们以fmt包...

  • Go语言学习四:I/O

    Go 语言I/O 涉及两大部分 :I/O ,File 一 I/O /** bufio包实现了有缓冲的I/O。它包装...

  • go语言能做什么

    鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式...

  • Go语言入坑

    GO语言基础 认识并安装GO语言开发环境 Go语言简介 Go语言是谷歌2009年发布的第二款开源编程语言 go语言...

  • I/O优化

    I/O基本知识 整个I/O操作由应用程序、文件系统和磁盘共同完成,应用程序将I/O命令发送到文件系统,文件系统在合...

  • 兄弟连Go语言培训分享Go协程测试

    Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面...

  • go语言能做什么

    Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面...

  • I/O流入门

    I/O I/O是任何编程语言都无法回避的问题,I/O是人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道...

  • Go语言I/O编程(一)----输入与输出

    在Go语言当中,I/O的操作主要被封装在以下几个包中: io:为I/O提供基本的接口,在这个包中最为重要的是两个接...

网友评论

    本文标题:Go语言I/O编程(二)----文件系统

    本文链接:https://www.haomeiwen.com/subject/vffunqtx.html