golang实现单线程文件拷贝
新人最近学习go语音,代码拉胯,各位看看得了。
最近使用cp命令在分布式存储中性能无法满足要求,需要多线程并发拷贝,尝试使用go语音编写文件拷贝工具。使用os标准库,当前实现单线程拷贝,后续会逐渐加上多线程拷贝。
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 获取命令行参数
list := os.Args
if len(list) != 3 {
fmt.Println("参数错误")
return
}
srcFileName := list[1]
desFileName := list[2]
if srcFileName == desFileName {
fmt.Println("原文件名和目的文件名相同")
return
}
// 只读方式打开源文件
sf, err := os.Open(srcFileName)
if err != nil {
fmt.Println("err = ", err)
return
}
// 新建目的文件
df, err := os.Create(desFileName)
if err != nil {
fmt.Println("error = ", err)
return
}
// 操作完毕,关闭文件
defer sf.Close()
defer df.Close()
// 从源文件读取内容写到目的文件中,读多少写多少
buf := make([]byte, 1024*1024*4) // 4M临时缓冲区
for {
// 从源文件读取内容
n, err := sf.Read(buf)
if err != nil {
if err == io.EOF {
// 读取完毕了
break
} else {
fmt.Println("error = ", err)
return
}
}
// 往目的文件写,读多少写多少
_, e := df.Write(buf[:n])
if e != nil {
fmt.Println(err)
return
}
}
}
上述代码简单实现了单线程拷贝,后面一章节实现函数化