Go语言复制文件
本文内容纲要:
在使用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