golang实现单线程文件拷贝-函数化
上篇实现了单线程拷贝,这篇用函数拆分了各个部分,后续将用多线程实现
package main
import (
"fmt"
"io"
"os"
)
// 获取命令行参数
func input() (srcFileName string, desFileName string) {
list := os.Args
if len(list) != 3 {
fmt.Println("参数错误")
os.Exit(-1)
}
srcFileName = list[1]
desFileName = list[2]
if srcFileName == desFileName {
fmt.Println("原文件名和目的文件名相同")
os.Exit(-1)
}
return
}
func createFile(srcFileName string, desFileName string) (sf *os.File, df *os.File) {
// 只读方式打开源文件
sf, err := os.Open(srcFileName)
if err != nil {
fmt.Println("err = ", err)
os.Exit(-1)
}
// 新建目的文件
df, err = os.Create(desFileName)
if err != nil {
fmt.Println("error = ", err)
os.Exit(-1)
}
return
}
func copyio(sf *os.File, df *os.File) {
// 从源文件读取内容写到目的文件中,读多少写多少
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
}
}
sf.Close()
df.Close()
}
func main() {
copyio(createFile(input()))
}