Go语言实现文件的断点续传

如题:

注释在代码中

package main

import (
	"fmt"
	"io"
	"log"
	"os"
	"strconv"
	"strings"
)

func main() {
	//C:\Users\Administrator\go\src\breakpoint\point.jpg
	//C:/Users/Administrator/Desktop/test.jpg
	//srcFile := "C:/Users/Administrator/go/src/breakpoint/point.jpg"
	//C:/Users/Administrator/Desktop/test.jpg

	// 需要复制的源文件
	srcFile := "C:/Users/Administrator/Desktop/test.jpg"


	// 复制到的目标文件
	destFile := srcFile[strings.LastIndex(srcFile, "/")+1:] //point.jpg
	fmt.Println(destFile)
	// 临时文件
	tmpFiel := destFile + "temp.txt"
	fmt.Println(tmpFiel)

	// 打开源文件,只读用Open()
	file1, err := os.Open(srcFile)
	HandleErr(err)
	// 打开/创建目标文件,操作目标文件对象
	file2, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY, os.ModePerm)
	HandleErr(err)
	// 打开/创建临时文件,操作临时文件对象
	file3, err := os.OpenFile(tmpFiel, os.O_CREATE|os.O_RDWR, os.ModePerm)
	HandleErr(err)

	defer file1.Close()
	defer file2.Close()

	//#1.先读取临时文件里面的数据,再seek()
	file3.Seek(0, io.SeekStart)
	// 读取的自己数组
	bs := make([]byte, 100, 100)

	// 临时文件读取
	n1, err := file3.Read(bs)
	//HandleErr(err)
	countStr := string(bs[:n1])
	// 临时文件中记录读取的数量/字节数
	count, err := strconv.ParseInt(countStr, 10, 64)
	//HandleErr(err)
	fmt.Println(count)

	// #2.设置偏移量,读写位置
	file1.Seek(count, io.SeekStart)
	file2.Seek(count, io.SeekStart)

	//读取文件数据量1024个字节
	data := make([]byte, 1024, 1024)
	n2 := -1            //读取的数据量
	n3 := -1            //写出的数据量
	total := int(count) //读取的总量

	// #3.复制文件
	for {
		// 读取源文件,每次读1024个字节
		n2, err = file1.Read(data)
		if err == io.EOF || n2 == 0 {
			fmt.Println("文件复制完毕...", total)
			file3.Close()
			os.Remove(tmpFiel)
			break
		}
		// 写入目标文件
		n3, err = file2.Write(data[:n2])
		// 读取总量相加
		total += n3

		// 将复制的总量,存储在临时文件中,从头开始写
		file3.Seek(0, io.SeekStart)
		// 写入临时文件中读取的数据量的位置
		file3.WriteString(strconv.Itoa(total))

		fmt.Printf("total: %d\n", total)
		//模拟断点,第一次放开注释,使程序中断,第二次,完成续传,文件传递完毕后删除临时文件
		//if total > 8000 {
		//	panic("假装断电")
		//}
	}

}

func HandleErr(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

实现思路:
读取的字节数量,存放在一个临时文件中,当程序被中断,再次读取的时候,去临时文件中将那个数据拿到,从临时文件中存储的数据再次开始读取文件,读取完毕后,删除临时文件.
临时文件只是记录读取的位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值