Go的学习路程:文件(四)|Go 主题月

692 阅读1分钟

通过之前的文章已经学习了文件的创建、读取以及写入。接下来学习文件的一些基本操作,例如:复制、移动、遍历文件夹等等。

复制文件

Go 文件复制我们可以借助 io 包的 Copy 方法来完成。

  • func Copy(dst Writer, src Reader) (written int64, err error)

written 表示写入的字节数。

普通复制

package main

import "fmt"
import "os"
import "io"

func main () {
    srcFile, err := os.Open("D:\\tmp\\f1.txt")

    if err != nil {
        fmt.Printf("打开文件错误,%v", err)
        return
    }
    defer srcFile.Close()

    destFile, err := os.Create("d:\\tmp\\f2.txt")
    if err != nil {
        fmt.Printf("创建文件错误,%v", err)
        return
    }
    defer destFile.Close()

    written, err := io.Copy(destFile, srcFile)
    if err == nil {
        fmt.Printf("复制成功,复制的字节数为: %d", written)
    }
}

如上代码演示了借助 io.Copy 方法实现文件的复制。

基于缓冲复制

同时也可以使用 Reader 和 Writer 来完成文件的复制。

package main

import "fmt"
import "os"
import "io"
import "bufio"

func main () {
    srcFile, err := os.Open("D:\\tmp\\f1.txt")

    if err != nil {
        fmt.Printf("打开文件错误,%v", err)
        return
    }
    defer srcFile.Close()

    reader := bufio.NewReader(srcFile)

    dstFile, err := os.Create("d:\\tmp\\f3.txt")
    if err != nil {
        fmt.Printf("创建文件错误,%v", err)
        return
    }
    writer := bufio.NewWriter(dstFile)
    defer func () {
        writer.Flush()
        dstFile.Close()
    }()

    written, err := io.Copy(writer, reader)
    if err == nil {
        fmt.Printf("复制成功,复制的字节数为: %d", written)
    }
}

如上代码演示了借助 io.Copy 及 bufio 包中的 Reader 和 Writer 来完成的文件复制。

移动文件

移动文件我们可以借助 io.Rename 方法。

  • func Rename(oldpath, newpath string) error
package main

import "fmt"
import "os"

func main () {
    err := os.Rename("D:\\tmp\\f2.txt", "D:\\tmp\\ht\\f2.txt")
    if err != nil {
            fmt.Println("移动文件成功")
    }
}

遍历文件夹

遍历文件夹可以使用 ioutil 库的 ioutil.ReadDir 方法。该方法会返回一个数组, 数组元素有文件的属性。

  • func ReadDir(dirname string) ([]fs.FileInfo, error)
package main

import "fmt"
import "io/ioutil"

func main () {
    fs, _ := ioutil.ReadDir("d:\\tmp")
    for _, f := range fs {
        if f.IsDir() {
            fmt.Printf("%s是一个目录\n", f.Name())
        } else {
            fmt.Printf("%s是一个文件\n", f.Name())
        }
    }
}