断点续传实现

断点续传

  • 什么是断点续传
  • 具体实现

本文使用go语言来实现对断点续传功能

什么是断点续传

其本质即在对文件的io操作中突然发生某种意外导致io操作中断,本处使用一个temp文件来记录文件传输过程中光标的位置,从而实现断点续传

具体实现

package main

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

/*
主要实现文件断点续传的功能,通过一个temp文件来记录当前传输的位置,在异常中断之后可以通过读取temp文件来继续上一次的文件读写任务
 */

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

func main(){
	srcFile := "xxx"
	desFile := "xxx"
	tempFile := "xxx"

	file1,err := os.Open(srcFile)
	HandleErr(err)
	file2,err := os.OpenFile(desFile,os.O_CREATE|os.O_WRONLY,os.ModePerm)
	file3,err := os.OpenFile(tempFile,os.O_CREATE|os.O_RDWR,os.ModePerm)

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

	//先读取数据在seek
	file3.Seek(0,io.SeekStart)
	bs := make([]byte,100,100)
	n1,err := file3.Read(bs)

	countStr := string(bs[:n1])
	count,err := strconv.ParseInt(countStr,10,64)
	HandleErr(err)

	//设置读,写的位置
	file1.Seek(count,io.SeekStart)
	file2.Seek(count,io.SeekStart)
	date := make([]byte,1024,1024)
	n2 := -1 //读取的数据量
	n3 := -1 //写出的数据量
	total := int(count) //读取的总量

	//复制文件
	for{
		n2,err = file1.Read(date)
		if err == io.EOF || n2 == 0{
			fmt.Print("文件传输完毕。。。")
			file3.Close()
			os.Remove(tempFile)
			break
		}
		n3,err = file2.Write(date[:n2])
		total += n3

		//将存储的总量写进临时文件
		file3.Seek(0,io.SeekStart)
		file3.WriteString(strconv.Itoa(total))

		//假装断电
		//if total > 8000{
		//	panic("断电了")
		//}
	}

}


你可能感兴趣的:(go,golang)