今天整理了一个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. 洛谷——P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  2. Java面试题总结之OOA/D,UML,和XML

    全文字数:   2732 阅读时间:   大约9 分钟 1.UML 是什么?常用的几种UML图? 统一建模语言(Unified Modeling Language,UML)又称标准建模语言:常用图包括 ...

  3. HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...

  4. Atom列编辑快捷键

    安装这个:sublime-style-column-selection,在Ubuntu下使用[Shitf]+鼠标左键选择.

  5. Windows7系统下优化固态硬盘

    一.AHCI硬盘模式可提高硬盘性能,确定你的固态硬盘是运行在AHCI模式下,打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicesmsahci” ...

  6. Office WORD里面打字,后面的字自动被删除怎么办

    word或其他编辑器里打字以后其后面的字就被自动删除了-解决方案   2011-09-26 14:52:09|  分类: 电脑维护|字号 订阅 解决方法:  再按一下 Insert键 就OK啦 今天有 ...

  7. AnkhSVN介绍

    AnkhSVN介绍 Posted on 2012-11-15 23:24 ArRan 阅读(3120) 评论(1) 编辑 收藏 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS ...

  8. Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)

    转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...

  9. 微信企业号调用js-sdk注意事项

    企业号应用必须添加可信域名,域名必须通过备案,可以是子域名,如果网站带端口,一定也要加上端口号...踩坑记

  10. SAP更改日志记录表

    CDHDR  更改日志表头 CDPOS  更改日志行项目 SAP中修改频率较低的定制表(T001等)一般都会有修改记录存在,查看一个表有没有修改记录可以在SE11中查看他的技术设置,如果其中的LOG ...