文件复制(Go语言实现)

在这里插package main

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

type MyCopy struct{}

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

//保存上次文件读取到的位置
var last string = "./last"

/**
* 功能:文件复制(支持断点续传)
* 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.Println("open srcFile failed: %v", err)
		return -1, err
	}

	des, err := os.OpenFile(dstFile, os.O_CREATE|os.O_WRONLY, 0775)
	if err != nil {
		fmt.Println("open desFile failed: %v", err)
		return -1, err
	}

	defer src.Close()
	defer des.Close()

	lastPos := c.GetLastPosition()
	position := 0

	if lastPos > 0 {
		src.Seek(int64(lastPos), io.SeekStart) //0
		des.Seek(int64(lastPos), io.SeekStart) //0
		position = lastPos
	}

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

	for {

		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) //模拟网络延迟
		des.Write(buf[:count])
		c.WritePosition([]byte(fmt.Sprintf("%d", position)))
		/*
			if position == 10 {
				fmt.Println("模拟中断传输")
				break
			}*/
	}
	fmt.Println("end============================================================")
	return position, nil
}

/*
 获取上次断点位置
*/
func (c *MyCopy) GetLastPosition() int {
	file, err := os.Open(last)

	if err != nil {
		return -1
	}

	defer file.Close()

	var buff [128]byte

	n, err := file.Read(buff[:])
	if err != nil {
		fmt.Println("Read lastfile failed: ", err)
		return -1
	}

	v, err := strconv.Atoi(string(buff[0:n]))
	if err != nil || v < 0 {
		fmt.Println("Atoi error")
		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() {j
	c := NewMyCopy()
	c.CopyFile("a.txt", "employer.go")
}
入代码片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值