加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

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

发布时间:2022-12-21 13:31:41 所属栏目:Unix 来源:未知
导读: os包提供了平台无关的操作系统功能接口,其错误处理采用的是UNIX风格的设计。
os:系统功能实现
os包的接口规定实现在所有操作系统中都是一致的。有一些系统特定的功能,需要使用syscall来

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包unix路径简化,而不是path包。

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章