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() 方法来完成。

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

原文地址:https://www.cnblogs.com/liuhe688/p/11429275.html