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协议中有关断点续传知识,有时候发觉东西只有 ...
随机推荐
- [AT3867] Digit Sum 2
给出N,求小于等于N的正整数中用十进制表示各数位数字之和的最大值. Solution 如果是X999的形式,那么就是自己 否则,就是(X-1)999 #include <bits/stdc++. ...
- python中的replace无法替换字符串
replace替换字符串的时候,需要重新赋值给变量,因为在python中字符串是不可变对象,因此在使用的时候我们必须重新赋值,就这么简单. z1=z1.replace('ddd','') 返回 ...
- SpringBoot学习- 7、问题Could not autowire. No beans of 'xxxx' type found处理
SpringBoot学习足迹 这个问题网上有好多同学都提到这个问题,代码可以运行,但是就是有红线,强迫症不能忍 自己试验下 1.增加一个final编译一下,再删掉就不会出红线了 public clas ...
- STL-priority_queue H - 看病要排队
H - 看病要排队 看病要排队这个是地球人都知道的常识.不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能 ...
- C#中常见的winform控件命名规范 转
我们知道Button 常常简称为btn,那么Winform中的其它控件呢,这篇文章在C#的winform控件命名规范 的基础上对一些控件的名称的简称进行了整理. 1. 标准控件 NO. 控件类型简写 ...
- ubuntu18 + caffe+cpu+anaconda3
本记录只暂时只记录一些错误. 编译错误,opencv3.2与anaconda3下的libtiff不兼容,冲突. 问题查找(查找所有的TIFF库与编译错误提示匹配/usr/lib/x86_64-linu ...
- 手动添加ubuntu服务
在/etc/init.d/目录下创建一个简单的服务脚本,假设脚本名为hello #!/bin/sh case "$1" in start) # start 的代码 ;; stop) ...
- VSFTPD服务器
我虽然vsftpd服务器做了百遍以上,但是我觉的成功率不大.我要写下这篇日记,来让我分析自己曾经的过错!! vsftpd的原理我不多讲!!!请自行百度吧!! 我搭建的环境是 Linux6.4 IP(1 ...
- C语言数据结构——第四章 串
四.串 4.1-串的基本概念 串的定义 串是由数字.字母或其他字符组成的有限序列,一般记为 StringName = “a[0]a[1]a[2]···a[i]···a[n-1]”(n>0,0&l ...
- 深度学习之numpy.poly1d()函数
1.np.poly1d()此函数有两个参数: 参数1:为一个数组,若没有参数2,则生成一个多项式,例如: p = np.poly1d([2,3,5,7]) print(p) ==>> ...