Go断点续传
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断点续传的更多相关文章
- HTML5实现文件断点续传
HTML5的FILE api,有一个slice方法,可以将BLOB对象进行分割.前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段 ...
- 总结iOS开发中的断点续传那些事儿
前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...
- (实例篇)PHP实现HTTP断点续传的方法
PHP实现HTTP断点续传的方法. <?php /** * PHP-HTTP断点续传实现 * @param string $path: 文件所在路径 * @param string $file: ...
- C# 文件下载之断点续传
注意,本文所说的断点续传特指 HTTP 协议中的断点续传.本文主要聊聊思路和关键代码,更多细节请参考本文附带的 demo. 工作原理 HTTP 协议中定义了一些请求/响应头,通过组合使用这些头信息.我 ...
- chunkupload文件上传断点续传组件(java)
chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. 从整体上讲,chunkupload会对文件进行切片处理,每个切片 ...
- wget 断点续传 & nginx文件服务器
nginx默认支持断点续传: 测试方法: wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | gr ...
- chunkupload 文件上传断点续传组件(java) - 正式发布
chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. chunkupload实现如下功能: · 实现断点续传 · ...
- ASP.NET WebAPi之断点续传下载(下)
前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...
- ASP.NET WebAPi之断点续传下载(中)
前言 前情回顾:上一篇我们遗留了两个问题,一个是未完全实现断点续传,另外则是在响应时是返回StreamContent还是PushStreamContent呢?这一节我们重点来解决这两个问题,同时就在此 ...
- ASP.NET WebAPi之断点续传下载(上)
前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有 ...
随机推荐
- Supervision meeting with Liu
data stream;streampipe/nifi data flow:1. algorithm;;;; top-k pattern, motif and so on 2. implication ...
- 备份Sql Server中的某些表
第一步:右键需要备份表的数据库 第二步:选择=>选择特定数据库对象,在下方选择你需要备份的数据表. 第三步,点击高级,在要编写脚本的数据的类型中选择架构和数据(看个人需要),根据需要可更换生成的 ...
- 【Unity|C#】基础篇(11)——内置的泛型委托(Action/Func/Predicate)
[Action] 无返回值 的泛型委托,可以有0~16个参数(函数重载) public delegate void Action(); // 无参数 public delegate void Acti ...
- python3读取、写入、追加写入excel文件
由于excel版本不同,python处理的时候选择的库页不同. 一.操作对应版本表格需要用到的库 1.操作xls格式的表格文件,需要用到的库如下: 读取:xlrd 写入:xlwt 修改(追加写入):x ...
- dev、test、pre和prod是什么意思?
开发环境(dev):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告. 测试环境(test):一般是克隆一份生产环境的配置,一个程序在测试环境工 ...
- 题解【洛谷P6029】[JSOI2010]旅行
题面 简化版题意:给出 \(n\) 个点 \(m\) 条边的无向图,可以交换任意两条边的权值 \(k\) 次,求 \(1\) 结点到 \(n\) 结点的最短路. 考虑\(\text{DP}\). 把所 ...
- 2019牛客多校第五场C generator 2 hash,bsgs模板
generator 2 题意 给出\(x_0,a,b,p\),有方程\(x_i\equiv (a*x_{i-1}+b)(\% p)\),求最小的i,使得\(x_i=v\),不存在输出-1 分析 经过公 ...
- 第一篇 网站基础知识 第5章 自己动手实现HTTP协议
第5章 自己动手实现HTTP协议 我们知道HTTP协议是在应用层解析内容的,只需要按照它的报文的格式封装和解析数据就可以了,具体的传输还是使用的Socket,在第4章NioServer的基础上自己做一 ...
- Oracle tnsnames.ora
安装过ORACLE的都知道,oracle安装时需要进行配置,这个配置可以在客户端的企业管理器一步一步进行,或者直接拷贝一个tnsnames.ora文件到安装目录下(c:\app\Administrat ...
- C++-函数与指针的关系(回调函数)
1.函数类型 C语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 ★ int add(int i, int j)的类型为int(int, int) C语言中通过typede ...