断点续传

一、熟悉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("断电了")
		//}
	}
}
posted @ 2023-05-24 11:29  晚秋时节  阅读(18)  评论(0)    收藏  举报