在使用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) } }