Go語言複製文件

在使用Go開發項目的過程當中,有時咱們須要作一些複製文件的功能,咱們能夠把它封裝成一個函數,在之後每次須要用到該功能的時候直接調用封裝的函數便可。函數

若是是大文件,咱們可使用os包,使用os.Open()os.Create()均可以獲取到文件句柄(文件指針),而後經過文件句柄(文件指針)的Read()Write()方法,按照字節讀取和寫入來實現複製文件的功能指針

對於大文件,咱們能夠採用下面的方式code

package main

import (
    "io"
    "log"
    "os"
)

func CopyFile(srcFileName string, dstFileName string) {
    //打開源文件
    srcFile, err := os.Open(srcFileName)
    if err != nil {
        log.Fatalf("源文件讀取失敗,緣由是:%v\n", err)
    }
    defer func() {
        err = srcFile.Close()
        if err != nil {
            log.Fatalf("源文件關閉失敗,緣由是:%v\n", err)
        }
    }()

    //建立目標文件,稍後會向這個目標文件寫入拷貝內容
    distFile, err := os.Create(dstFileName)
    if err != nil {
        log.Fatalf("目標文件建立失敗,緣由是:%v\n", err)
    }
    defer func() {
        err = distFile.Close()
        if err != nil {
            log.Fatalf("目標文件關閉失敗,緣由是:%v\n", err)
        }
    }()
    //定義指定長度的字節切片,每次最多讀取指定長度
    var tmp = make([]byte, 1024*4)
    //循環讀取並寫入
    for {
        n, err := srcFile.Read(tmp)
        n, _ = distFile.Write(tmp[:n])
        if err != nil {
            if err == io.EOF {//讀到了文件末尾,而且寫入完畢,任務完成返回(關閉文件的操做由defer來完成)
                return
            } else {
                log.Fatalf("拷貝過程當中發生錯誤,錯誤緣由爲:%v\n", err)
            }
        }
    }
}

func main() {
    CopyFile("./worm.mp4", "./dist.mp4")
}

使用io包的Copy方法也能實現文件複製功能orm

package main

import (
    "fmt"
    "io"
    "os"
)

//本身編寫一個函數,接收兩個文件路徑 srcFileName dstFileName
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {

    srcFile, err := os.Open(srcFileName)

    if err != nil {
        fmt.Printf("open file err = %v\n", err)
        return
    }

    defer srcFile.Close()

    //打開dstFileName

    dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0755)
    if err != nil {
        fmt.Printf("open file err = %v\n", err)
        return
    }

    defer dstFile.Close()

    return io.Copy(dstFile, srcFile)

}

func main() {

    result, err := CopyFile("./src/main/dst.png", "./src/main/file.png")

    if err == nil {
        fmt.Println("拷貝成功!,拷貝的字節數爲: ", result)
    }
}

還可使用下面的方法開發

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

//本身編寫一個函數,接收兩個文件路徑 srcFileName dstFileName

func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {

    srcFile, err := os.Open(srcFileName)

    if err != nil {
        fmt.Printf("open file err = %v\n", err)
        return
    }

    defer srcFile.Close()

    //經過srcFile,獲取到Reader
    reader := bufio.NewReader(srcFile)

    //打開dstFileName
    dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)
    if err != nil {
        fmt.Printf("open file err = %v\n", err)
        return
    }

    writer := bufio.NewWriter(dstFile)
    defer func() {
        writer.Flush() //把緩衝區的內容寫入到文件
        dstFile.Close()

    }()

    return io.Copy(writer, reader)

}

func main() {

    result, err := CopyFile("./src/main/dst.png", "./src/main/file.png")

    if err == nil {
        fmt.Println("拷貝成功!拷貝的字節大寫爲: ", result)
    }
}
相關文章
相關標籤/搜索