Go语言模拟文件断点续传以及多协程读取写入文件操作

今天整理了一个Go语言多协程拷贝文件的案例,之前用Java写过,这次用Go语言来写一下,代码不难,也很简单,但是网上没有案例,整了很长时间。下面贴出来,供其他人参考学习。

func main(){

	fileName := "F:\\myWorks\\丽君-全家福.png"
	desfileName := "F:\\myWorks\\丽君-全家福-bak.png"
	sfile,err := os.Open(fileName)
	if err != nil{
		fmt.Println(nil)
	}

  
	info,_ := os.Stat(fileName)
	size := info.Size()
	var scount  int64 = 1
    //这里切分原意为通过协程来分段读取
	if size % 2 == 0{
		scount *= 2
	}else if size % 3 == 0 {
		scount *= 3
	}else{
		scount *= 1
	}
	si := size / scount
	fmt.Printf("文件总大小:%v, 分片数:%v,每个分片大小:%v",size,scount,si)

	desF,err := os.OpenFile(desfileName,os.O_CREATE|os.O_RDONLY|os.O_APPEND,0755)
	if err != nil{
		fmt.Println(err)
	}

	for i:=0;i<=int(scount);i++{
			//申明一个byte
			b := make([]byte,si)
			//从哪个位置开始读
			sfile.Seek(int64(i)*si,0)
			//读到byte数组里边
			sfile.Read(b)
			//从哪个位置开始写
			desF.Seek(int64(i)*si,0)
			//写入
			desF.Write(b)
	}

	defer desF.Close()
	defer sfile.Close()
}

上面的版本是一个按顺序写入的,虽然说是分片了但还是单协程,接下来改造一个多协程版本的。

func main(){

	fileName := "F:\\myWorks\\首页_1.png"
	desfileName := "F:\\myWorks\\首页_1-bak.png"
	sfile,err := os.Open(fileName)
	if err != nil{
		fmt.Println(nil)
	}

	info,_ := os.Stat(fileName)
	size := info.Size()
	var scount  int64 = 1
	if size % 2 == 0{
		scount *= 2
	}else if size % 3 == 0 {
		scount *= 3
	}else{
		scount *= 1
	}

	si := size / scount
	fmt.Printf("文件总大小:%v, 分片数:%v,每个分片大小:%v\n",size,scount,si)

	desF,err := os.OpenFile(desfileName,os.O_CREATE|os.O_RDWR,0755)
	if err != nil{
		fmt.Println(err)
	}

	for i:=0;i<int(si);i++{
		go func(vs int){
			//申明一个byte
			b := make([]byte,si)
			//从指定位置开始读
			sfile.ReadAt(b,int64(vs)*si)
			//从指定位置开始写
			desF.WriteAt(b,int64(vs)*si)

		}(i)
	}
	time.Sleep(time.Second*5)
	defer desF.Close()
	defer sfile.Close()
}

有问题可以在下方评论,技术问题可以私聊我。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值