在使用Go开发项目的过程中,有时我们需要做一些复制文件的功能,我们可以把它封装成一个函数,在以后每次需要用到该功能的时候直接调用封装的函数即可。
如果是大文件,我们可以使用os包,使用os.Open()和os.Create()都可以获取到文件句柄(文件指针),然后通过文件句柄(文件指针)的Read()和Write()方法,按照字节读取和写入来实现复制文件的功能
对于大文件,我们可以采用下面的方式
packagemain import( "io" "log" "os" ) funcCopyFile(srcFileNamestring,dstFileNamestring){ //打开源文件 srcFile,err:=os.Open(srcFileName) iferr!=nil{ log.Fatalf("源文件读取失败,原因是:%v\n",err) } deferfunc(){ err=srcFile.Close() iferr!=nil{ log.Fatalf("源文件关闭失败,原因是:%v\n",err) } }() //创建目标文件,稍后会向这个目标文件写入拷贝内容 distFile,err:=os.Create(dstFileName) iferr!=nil{ log.Fatalf("目标文件创建失败,原因是:%v\n",err) } deferfunc(){ err=distFile.Close() iferr!=nil{ log.Fatalf("目标文件关闭失败,原因是:%v\n",err) } }() //定义指定长度的字节切片,每次最多读取指定长度 vartmp=make([]byte,1024*4) //循环读取并写入 for{ n,err:=srcFile.Read(tmp) n,_=distFile.Write(tmp[:n]) iferr!=nil{ iferr==io.EOF{//读到了文件末尾,并且写入完毕,任务完成返回(关闭文件的操作由defer来完成) return }else{ log.Fatalf("拷贝过程中发生错误,错误原因为:%v\n",err) } } } } funcmain(){ CopyFile("./worm.mp4","./dist.mp4") }使用io包的Copy方法也能实现文件复制功能
packagemain import( "fmt" "io" "os" ) //自己编写一个函数,接收两个文件路径srcFileNamedstFileName funcCopyFile(dstFileNamestring,srcFileNamestring)(writtenint64,errerror){ srcFile,err:=os.Open(srcFileName) iferr!=nil{ fmt.Printf("openfileerr=%v\n",err) return } defersrcFile.Close() //打开dstFileName dstFile,err:=os.OpenFile(dstFileName,os.O_WRONLY|os.O_CREATE,0755) iferr!=nil{ fmt.Printf("openfileerr=%v\n",err) return } deferdstFile.Close() returnio.Copy(dstFile,srcFile) } funcmain(){ result,err:=CopyFile("./src/main/dst.png","./src/main/file.png") iferr==nil{ fmt.Println("拷贝成功!,拷贝的字节数为:",result) } }还可以使用下面的方法
packagemain import( "bufio" "fmt" "io" "os" ) //自己编写一个函数,接收两个文件路径srcFileNamedstFileName funcCopyFile(dstFileNamestring,srcFileNamestring)(writtenint64,errerror){ srcFile,err:=os.Open(srcFileName) iferr!=nil{ fmt.Printf("openfileerr=%v\n",err) return } defersrcFile.Close() //通过srcFile,获取到Reader reader:=bufio.NewReader(srcFile) //打开dstFileName dstFile,err:=os.OpenFile(dstFileName,os.O_WRONLY|os.O_CREATE,0666) iferr!=nil{ fmt.Printf("openfileerr=%v\n",err) return } writer:=bufio.NewWriter(dstFile) deferfunc(){ writer.Flush()//把缓冲区的内容写入到文件 dstFile.Close() }() returnio.Copy(writer,reader) } funcmain(){ result,err:=CopyFile("./src/main/dst.png","./src/main/file.png") iferr==nil{ fmt.Println("拷贝成功!拷贝的字节大写为:",result) } }本文内容总结:
原文链接:https://www.cnblogs.com/itbsl/p/10138548.html