今天整理了一个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()
}

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

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

  1. c文件二进制读取写入文件、c语言实现二进制(01)转化成txt格式文本、c读取文件名可变

    c语言实现二进制(01)转化成txt格式文本: 下面的程序只能实现ascall对应字符转换,如果文件内出现中文字符,则会出现错误. 本程序要自己创建个文本格式的输入文件a1.txt,编译后能将文本文件 ...

  2. 关于Python中读取写入文件并进行文件与用户交互的操作

    一.提前知识点 在python中是同样和其他语言一样可以进行文件的读取写入操作,值得注意的是,Python中打开文件读取的方式有几种,分别是以下几种: f = open('username.txt') ...

  3. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  4. pandas-19 DataFrame读取写入文件的方法

    pandas-19 DataFrame读取写入文件的方法 DataFrame有非常丰富的IO方法,比如DataFrame读写csv文件excel文件等等,操作很简单.下面在代码中标记出来一些常用的读写 ...

  5. Unity3d 通过协程来实现文件的全部加载后执行

    相信大家会经常遇到在游戏中需要WWW从本地或者服务器上获取数据,而我们通常容易会犯下面这种个错误:当数据较少或者网速较好时程序运行正常.而当数据较大或者网速不好时程序会出错误.比如卡住. 所以我们要使 ...

  6. 用C# 模拟实现unity里的协程

    注:需要了解C#的迭代器,不然很难理解. 之前面试有被问到unity协程的原理,以及撇开unity用纯C#去实现协程的方法.后来了解一下,确实可以的.趁这会有空,稍微总结一下. 还是结合代码说事吧: ...

  7. go语言之进阶篇创建goroutine协程

    1.goroutine是什么 goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现 ...

  8. Unity下载文件一(www协程下载)

    下载功能,是大多数游戏或者软件都需具备的一个基础模块,但是很多人却没有机会去写这个完整功能. 那么我就分享下我写该功能时的随笔整理 本文只说www协程下载,http的同步和异步下载放到下篇 这个简单: ...

  9. go语言从例子开始之Example21.协程

    Go 协程 在执行上来说是轻量级的线程. golang使用协程用go关键字.后边正常调用函数. Example: package main import "fmt" func ak ...

随机推荐

  1. 洛谷——P1038 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  2. FF,chrome与IE的事件处理程序

    今天学习了js的事件处理程序,IE与FF,chrome,safari,opera的处理事件方法不同,FF,chrome,safari,opera支持addEventLisener,而addEventL ...

  3. Date日期模式

    package cn.zmh.Date; import java.text.SimpleDateFormat; import java.util.Date; public class DateDemo ...

  4. 关键字检索高亮标出-javasript/jQuery代码实现

    原文:http://www.open-open.com/code/view/1454504432089 此方法传入2个参数,一个是被检索内容所在的表单或者HTML元素的ID,另一为关键字,多个关键字的 ...

  5. 火狐firefox、谷歌chrome等浏览器扩展、插件介绍

    火狐旧的插件扩展已经不可用,需要更新,这是本人安装的最新的插件 chrome插件 https://www.zhihu.com/question/68338297

  6. 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)

    各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...

  7. poj1904 二分图匹配+强连通分量

    http://poj.org/problem?id=1904 Description Once upon a time there lived a king and he had N sons. An ...

  8. Unity Critter地图导出到server配置

    普通情况下,从Critter导出的地图会与Unity自带的Navigation洪培出的地图会有比較大的差异.须要耐心调整Critter的參数才干够. 以下是我调的參数,与Unity导出的地图基本相似. ...

  9. vue 配置跨域访问

    主要在config->index.js中配置 proxyTable: { ‘/gameapi’: { changeOrigin: true, // target: ‘http://rap.id. ...

  10. 【转载】在VS2008中使用WSE 3.0过程全记录

    WSE全称是Web Service Enhancement,提供了更好的安全性实现,以及大对象传输的设计. 有关WSE的一些介绍,如果不清楚,可以参考下面的链接 官方介绍:http://www.mic ...