• Golang: 读写之外的其他文件操作


    在上一篇文章中,我们介绍了常用的文件读写操作,今天接着来研究一下,除了读写以外的其他常见文件操作。

    一、创建目录:

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        // 创建单个目录
        os.Mkdir("go", os.ModePerm)
    
        // 创建多级目录
        os.MkdirAll("go/lang", os.ModePerm)
    
        // 返回FileInfo实例
        info, _ := os.Stat("go/lang")
    
        printFileInfo(info)
    }
    
    // 显示文件信息
    func printFileInfo(info os.FileInfo) {
        fmt.Printf("name: %v 
    ", info.Name()) // 文件名
        fmt.Printf("size: %v 
    ", info.Size()) // 文件大小
        fmt.Printf("mode: %v 
    ", info.Mode()) // 文件权限
        fmt.Printf("is dir: %v 
    ", info.IsDir()) // 是否为目录类型
        fmt.Printf("modify time: %v 
    ", info.ModTime()) // 最后修改时间
    }
    

    os.Mkdir() 方法只能创建单个目录,而 os.MkdirAll() 可以创建多级目录。

    最后我们使用 os.State() 方法获取目录或文件的描述对象,通过这个对象,我们可以得到目录或文件的各种常用信息。

    二、检测目录或文件是否存在:

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        path := "go/lang/test.txt"
    
        // 返回FileInfo实例
        info, err := os.Stat(path)
    
        // 检测文件或目录是否存在
        if (os.IsNotExist(err)) {
            // 创建文件
            os.Create(path)
        
            // 重新获取FileInfo
            info, _ = os.Stat(path)
        }
    
        printFileInfo(info)
    }
    
    // 显示文件信息
    func printFileInfo(info os.FileInfo) {
        fmt.Printf("name: %v 
    ", info.Name())
        fmt.Printf("size: %v 
    ", info.Size())
        fmt.Printf("mode: %v 
    ", info.Mode())
        fmt.Printf("is dir: %v 
    ", info.IsDir())
        fmt.Printf("modify time: %v 
    ", info.ModTime())
    }
    

    如果 err 的值为 nil,则表示文件存在,可完成后续的操作。

    如果要判断文件不存在,则要通过 os.isNotExist(err) 方法来检测。

    三、列举目录下的所有文件:

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "path"
    )
    
    func main() {
        dirPath := "go/lang"
    
        // 利用ioutil读取目录
        files, _ := ioutil.ReadDir(dirPath)
    
        // 遍历目录
        for _, fileInfo := range files {
            fileName := fileInfo.Name()
    
            // 拼接路径
            filePath := path.Join(dirPath, fileName)
    
            fmt.Println(filePath)
        }
    }
    

    ioutil.ReadDir() 方法的完整签名是:func ReadDir(dirname string) ([]os.FileInfo, error),它返回一个 os.FileInfo 类型的切片,我们可以遍历这个结果,逐个处理目录下的每一个文件。

    如果遍历的过程中遇到子目录,我们可以通过 fileInfo.IsDir() 来检测,如果检测结果是目录,则再进行递归调用即可。

    值得一提的是,path/filepath 包提供了遍历多级目录的方法,下面我们演示一下:

    package main
    
    import (
        "fmt"
        "path/filepath"
        "os"
    )
    
    func main() {
        dirPath := "go"
    
        filepath.Walk(dirPath, func(path string, fileInfo os.FileInfo, err error) error {
            if fileInfo == nil {
                return err
            }
    
            isDir := fileInfo.IsDir()
    
            fmt.Println(path, "is dir?", isDir)
    
            return nil
        })
    }
    

    四、重命名文件:

    package main
    
    import (
        "os"
    )
    
    func main() {
        // 对文件重命名
        os.Rename("go/lang/test.txt", "go/lang/test2.txt")
    }
    

    五、移除目录或文件:

    package main
    
    import (
        "os"
    )
    
    func main() {
        // 移除文件或空目录
        os.Remove("go/lang/test2.txt")
        // 移除文件或目录
        os.RemoveAll("go")
    }
    

    os.Remove() 方法可以移除单个文件或空目录,如果想移除非空目录,则需要调用 os.RemoveAll() 方法来完成。

    关于文件的操作方式还有很多,今天就先介绍到这里吧,后续有时间再补充。

  • 相关阅读:
    无人值守安装linux
    数组中只出现过一次的数字 牛客网 剑指Offer
    数组中出现次数超过一半的数字 牛客网 剑指Offer
    数据流中的中位数 牛客网 剑指Offer
    数字在排序数组中出现的次数 牛客网 剑指Offer
    数值的整数次方 牛客网 剑指Offer
    按之字形顺序打印二叉树 牛客网 剑指Offer
    把数组排成最小的数 牛客网 剑指Offer
    把字符串转换成整数 牛客网 剑指Offer
    把二叉树打印成多行 牛客网 剑指Offer
  • 原文地址:https://www.cnblogs.com/liuhe688/p/11429275.html
Copyright © 2020-2023  润新知