美文网首页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编程(二)----文件系统

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