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