断点续传
一、熟悉os、strconv包相关知识
二、案例
package main
import (
"fmt"
"io"
"os"
"strconv"
)
// 复制文件
func main() {
// 断点续传
// 源文件
sourceFile := "C:\\Users\\yyll\\Desktop\\lf.jpg"
// 目标文件
targetFile := "F:\\20_environment\\04_go_works\\src\\lesson11\\server\\lf.jpg"
// 临时文件
tempFile := "F:\\20_environment\\04_go_works\\src\\lesson11\\temp.txt"
// 1、建立连接
file1, _ := os.Open(sourceFile)
file2, _ := os.OpenFile(targetFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
defer file1.Close()
defer file2.Close()
// file3光标重置
file3.Seek(0, io.SeekStart)
buf := make([]byte, 1024, 1024)
// temp.txt存储了 多少字节
n, _ := file3.Read(buf)
countStr := string(buf[:n])
// 将字符串转为数字类型
count, _ := strconv.ParseInt(countStr, 10, 64)
total := int(count)
// 光标设置
file1.Seek(count, io.SeekStart)
file2.Seek(count, io.SeekStart)
bufData := make([]byte, 1024, 1024)
for {
// 读取源文件数据
readNum, err := file1.Read(bufData)
if err == io.EOF {
// 读取完毕
fmt.Println("读取完毕 over")
file3.Close()
// 删除临时文件
os.Remove(tempFile)
// 跳出循环
break
}
// 写入目标文件
writeNum, err := file2.Write(bufData[:readNum])
// 将写入的字节数 + 刚开始的
total += writeNum
file3.Seek(0, io.SeekStart)
file3.WriteString(strconv.Itoa(total))
// 模拟断电
//if total > 5000 {
// panic("断电了")
//}
}
}
即使再小的帆也能远航

浙公网安备 33010602011771号