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

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

最新文章

  1. 三分钟学会funsioncharts
  2. iOS架构基础
  3. 使用R进行倾向得分匹配
  4. android: 服务的基本用法
  5. AssetBundle系列——资源的加载、简易的资源管理器
  6. [3d跑酷] Xcode5 打包 发布配置
  7. Android The content of the adapter has changed but ListView did not receive a notification终极解决方法
  8. 向Window BCD 文件添加VHD开机启动项的相关笔记
  9. 对C#泛型中的new()约束思考
  10. 【转】Contrary to the answers here, you DON&#39;T need to worry about encoding!
  11. Spring + CXF(REST):webservice not found
  12. Android的启动模式
  13. Linux命令之xargs的分析及隐患
  14. Linux Socket编程注意事项
  15. LeetCode——Search a 2D Matrix
  16. Node.js(初识)
  17. HUST 1602 Substring
  18. rpc-远程调用框架
  19. Java中动态代理工作流程
  20. java知识思维图解

热门文章

  1. 关于Java第一次实验的对课后问题自己的理解--验证码实现及其四则运算
  2. easyUI排序问题
  3. jdk8 stream可以与list,map等数据结构互相转换
  4. [开源]OSharpNS - .net core 快速开发框架 - 简介
  5. leetcode笔记:Longest Substring Without Repeating Characters
  6. 【转】 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  7. Python练习题2
  8. java.lang.ClassCastException: $Proxy0 cannot be cast to javax.servlet.ServletRequestWrapper
  9. cmd下复制粘贴
  10. struts2多图片上传实例【转】