package io
func Copy(dst Writer, src Reader) (written int64, err error)
将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;
否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。
需求
代码实现
// 拷贝文件package mainimport ("bufio""fmt""io""os")// 编写拷贝文件或者目录的函数func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {// func Copy(dst Writer, src Reader) (written int64, err error)// 需要实现一个 Writer 和一个 Reader// 1、 先读取源文件,得到一个 Readervar reader *bufio.Readervar writer *bufio.WritersrcFile, err := os.Open(srcFileName)if err != nil {fmt.Printf("Open file: %v error: %v \n", srcFileName, err)} else {reader = bufio.NewReader(srcFile)// reader 类型: *bufio.Reader,fmt.Printf("reader 类型: %T, 值: %v \n", reader, reader)}defer srcFile.Close()// 2、打开 dstFileName ,得到一个 WriterdstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Printf("Open file: %v error: %v \n", dstFileName, err)} else {writer = bufio.NewWriter(dstFile)// writer 类型: *bufio.Writer,fmt.Printf("writer 类型: %T, 值: %v \n", writer, writer)}defer dstFile.Close()// 3、传入 Reader Writer , 调用 os.Copy(), 并返回return io.Copy(writer, reader)}func main() {filepath01 := "C:/Users/xiao/Pictures/iphone/baby.jpg"filepath02 := "C:/Users/xiao/Pictures/iphone/01.jpg"// 将 filepath02 拷贝到 filepath01, 并命名为 01.jpg_, err := CopyFile(filepath02, filepath01)if err != nil {fmt.Println("拷贝失败", err)} else {fmt.Println("拷贝成功")}}
代码解读
主要就是实现一个 Writer 和一个 Reader
io.Copy() 内部实现是带缓存的,读一点写一点,可以拷贝大文件
吐槽
Golang 为什么就没有一些语法糖呢,函数式编程🤔
