go文件断点续传(简易版本)

本文介绍了一种使用Go语言实现的文件复制方法,该方法支持断点续传功能,通过记录并读取上次的断点位置,实现从断点处继续复制文件,避免了因网络或系统中断而重新开始复制的麻烦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

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

type MyCopy struct{}

func NewMyCopy() *MyCopy {
	return new(MyCopy)
}

var last string = "/tmp/last.txt"

/**
* 功能:文件复制(支持断点续传)
* Seek(offset int64, whence int) (ret int64, err error) 表示设置当前光标的位置
* offset int,设置多个字节
* whence int,从哪开始 0->距离文件开头 1->当前位置 2->距离文件末尾
*
 */

func (c *MyCopy) CopyFile(dstFile, srcFile string) (int, error) {
	src, err := os.Open(srcFile)
	if err != nil {
		fmt.Printf("open srcFile failed:%v\n", err)
		return -1, err
	}

	dst, err := os.OpenFile(dstFile, os.O_CREATE|os.O_WRONLY, 0775)
	if err != nil {
		fmt.Printf("open dstFile failed:%v\n", err)
		return -1, err
	}
	defer src.Close()
	defer dst.Close()

	lastPos := c.GetLastPosition()
	var position int = 0
	if lastPos > 0 {
		src.Seek(int64(lastPos), io.SeekStart) //0
		dst.Seek(int64(lastPos), io.SeekStart) //0 
		position = lastPos
	}

	fmt.Printf("当前读取位置为:%d\n", position)
	var buf [128]byte

	for {
		/*if position == 512 {
			 fmt.Println("模拟中断传输")
			 break
		 }*/

		count, err := src.Read(buf[:])
		if err == io.EOF {
			os.Remove(last) //删除记录内容
			break
		}

		if err != nil {
			fmt.Printf("read file context failed:%v\n", err)
			break
		}

		position += count
		fmt.Printf("copy cap:%d\r", position)
		time.Sleep(100 * time.Millisecond) //模拟网络延迟
		dst.Write(buf[:count])
		c.WritePosition([]byte(fmt.Sprintf("%d", position)))
	}
	fmt.Println()
	return position, nil

}

/*
* 获取上次断点位置
 */

func (c *MyCopy) GetLastPosition() int {
	file, err := os.Open(last)
	if err != nil {
		return -1
	}
	defer file.Close()
	var buf [128]byte
	n, err := file.Read(buf[:])
	if err != nil {
		return -1
	}

	v, err := strconv.Atoi(string(buf[:n]))
	if err != nil {
		return -1
	}
	if n <= 0 {
		return -1
	}
	return v
}

/**
* 写入当前读取到位置
 */
func (c *MyCopy) WritePosition(v []byte) {
	//Write(b []byte) (n int, err error)
	file, err := os.OpenFile(last, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Printf("write last position to failed:%v\n", err)
		return
	}
	file.Write(v)
	defer file.Close()
}

func main() {
	c := NewMyCopy()
	c.CopyFile("a.txt", "employer.go")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值