1. seek

package main

import (
"os"
"log"
"fmt"
"io"
) func main() {
/*
Seek(offset int64, whence int) (int64, error),设置指针光标的位置
第一个参数:偏移量
第二个参数:如何设置
0:seekstart,表示相对于文件开始
1:seekcurrent,表示相对于当前位置的偏移量
2:seekend,表示相对于末尾 // Seek whence values.
const (
SeekStart = 0 // seek relative to the origin of the file
SeekCurrent = 1 // seek relative to the current offset
SeekEnd = 2 // seek relative to the end
)
*/
fileName := "/Users/ruby/Documents/pro/a/aa.txt"
file,err := os.OpenFile(fileName,os.O_RDWR,os.ModePerm)
if err != nil{
log.Fatal(err)
}
defer file.Close()
//读写
bs :=[]byte{0}
file.Read(bs)
fmt.Println(string(bs)) //相对于文件头偏移4个字节
file.Seek(4,io.SeekStart)
file.Read(bs)
fmt.Println(string(bs)) //相对于文件末尾
file.Seek(2,0) //SeekStart
file.Read(bs)
fmt.Println(string(bs)) //相对于当前位置
file.Seek(3,io.SeekCurrent)
file.Read(bs)
fmt.Println(string(bs)) file.Seek(0,io.SeekEnd)
file.WriteString("ABC")
}

2. 断点续传

package main

import (
"strings"
"fmt"
"os"
"log"
"io"
"strconv"
) func main() {
/*
断点续传:
文件传递:文件复制 "/Users/ruby/Documents/pro/a/guliang.jpeg" 复制到当前的工程下: 思路:边复制,边记录复制的总量 */
srcFile := "/Users/ruby/Documents/pro/a/guliang.jpeg"
destFile := srcFile[strings.LastIndex(srcFile,"/")+1:] //切割
fmt.Println(destFile) //guliang.jpeg
tempFile := destFile+"temp.txt"
fmt.Println(tempFile) file1,err := os.Open(srcFile)
HandleErr(err)
file2,err := os.OpenFile(destFile,os.O_CREATE|os.O_WRONLY,os.ModePerm)
HandleErr(err)
file3,err := os.OpenFile(tempFile,os.O_CREATE|os.O_RDWR,os.ModePerm)
HandleErr(err) defer file1.Close()
defer file2.Close() //step1:先读取临时文件中的数据,再seek
file3.Seek(0,io.SeekStart)
bs := make([]byte,100,100)
n1,err := file3.Read(bs)
//HandleErr(err)
countStr := string(bs[:n1])
count,err := strconv.ParseInt(countStr,10,64)
//HandleErr(err)
fmt.Println(count) //step2:设置读,写的位置:
file1.Seek(count,io.SeekStart)
file2.Seek(count,io.SeekStart)
data := make([]byte,1024,1024)
n2 := -1 //读取的数据量
n3 := -1 //写出的数据量
total := int(count) //读取的总量 //step3:复制文件
for{
n2,err =file1.Read(data)
if err == io.EOF || n2 == 0{
fmt.Println("文件复制完毕。。",total)
file3.Close()
os.Remove(tempFile)
break
}
n3,err = file2.Write(data[:n2])
total += n3 //将复制的总量,存储到临时文件中
file3.Seek(0,io.SeekStart)
file3.WriteString(strconv.Itoa(total)) fmt.Printf("total:%d\n",total) //假装断电
//if total > 8000{
// panic("假装断电了。。。")
//} } } func HandleErr(err error){
if err != nil{
log.Fatal(err)
}
}

Go断点续传的更多相关文章

  1. HTML5实现文件断点续传

    HTML5的FILE api,有一个slice方法,可以将BLOB对象进行分割.前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段 ...

  2. 总结iOS开发中的断点续传那些事儿

    前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...

  3. (实例篇)PHP实现HTTP断点续传的方法

    PHP实现HTTP断点续传的方法. <?php /** * PHP-HTTP断点续传实现 * @param string $path: 文件所在路径 * @param string $file: ...

  4. C# 文件下载之断点续传

    注意,本文所说的断点续传特指 HTTP 协议中的断点续传.本文主要聊聊思路和关键代码,更多细节请参考本文附带的 demo. 工作原理 HTTP 协议中定义了一些请求/响应头,通过组合使用这些头信息.我 ...

  5. chunkupload文件上传断点续传组件(java)

    chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. 从整体上讲,chunkupload会对文件进行切片处理,每个切片 ...

  6. wget 断点续传 & nginx文件服务器

    nginx默认支持断点续传: 测试方法: wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | gr ...

  7. chunkupload 文件上传断点续传组件(java) - 正式发布

    chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. chunkupload实现如下功能: ·  实现断点续传 ·  ...

  8. ASP.NET WebAPi之断点续传下载(下)

    前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...

  9. ASP.NET WebAPi之断点续传下载(中)

    前言 前情回顾:上一篇我们遗留了两个问题,一个是未完全实现断点续传,另外则是在响应时是返回StreamContent还是PushStreamContent呢?这一节我们重点来解决这两个问题,同时就在此 ...

  10. ASP.NET WebAPi之断点续传下载(上)

    前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有 ...

随机推荐

  1. 巨杉TechDay回顾 | 技术人的夏天 · 就是这么燃!

    在All in Cloud的云计算时代,业务和应用正在不断“云化”,在此过程中云原生(Cloud Native)理念应运而生.作为云化改造的重要部分,云数据库因其天生的弹性扩展能力以及灵活.易用等特点 ...

  2. JavaScript的BOM对象

    JavaScript的BOM对象 BOM:浏览器对象模型 JavaScript和浏览器的关系:JavaScript的诞生就是为了能够让它再浏览器中运行. 1. 操作BOM对象 1.1 window w ...

  3. 2.restEasy中@PathParam和@QueryParam的区别

    例如代码: @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public T query(@PathParam( ...

  4. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  5. 题解【洛谷P5658】[CSP-S 2019]括号树

    题面 一道简单的栈与\(\text{DP}\)的结合. 首先介绍一下序列上的括号匹配问题,也就是此题在序列上的做法: 设 \(dp_i\) 表示以 \(i\) 结尾的合法的括号序列个数, \(ss_i ...

  6. 在sql server中如何检测一个字符串中是否包含另一个字符串

    select CHARINDEX('456','123456')   SQL语句使用CHARINDEX函数,来测试一个字符串中是否包含另一个字符串中的方法: 一.CHARINDEX函数介绍 1.函数功 ...

  7. docker使用nginx实现ssl(https)反向代理其他容器应用

    安装nginx容器 搜索nginx镜像 docker search nginx 拉取最新版nginx docker pull nginx:latest 运行容器 docker run --name=n ...

  8. Java-POJ1014-Dividing

    多重背包问题的特点是物品数量可以大于1但是有限制.状态定义与01背包一致. 多重背包的解法有多种,复杂度也各不相同. 对于物品数Ci较大的数据,可以采取二进制数进行优化(就是这样,别问就是baidu! ...

  9. php设计模式之多态实例代码

    <?php header("Content-type:text/html;charset=utf-8"); /** * 虎 */ abstract class Tiger { ...

  10. Educational Codeforces Round 76 D

    这次的ABC三道题非常水,但是我就卡在这个D题上了QAQ 当时大概猜到了贪心,但是没有思路,后来看了一些题解才明白到底是什么意思 首先,假设我们已经处理好了前面的monsters,对于第i个monst ...