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协议中有关断点续传知识,有时候发觉东西只有 ...
随机推荐
- ALSA lib-ext plugin
参考pcm_speex.c #include <stdio.h> #include <string.h> #include <unistd.h> #include ...
- jQuery遇到问题的小记
对jQuery动态加载到页面的数据进行处理的时候,要首先保证数据已经加载到页面上了.否则,处理不生效. 所以处理的代码应该保证在加载数据代码的后面. 这个问题源于对js的加载运行过程不熟悉.应该去了解 ...
- (转)正则表达式:string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement
string.replaceAll中的特殊字符 string.replaceAll(String regex, String replacement)中的replacement参数即替换内容中含有特殊 ...
- 剖析Javascript中forEach()底层原理,如何重写forEach()
我们平时用的forEach()一般是这样用的 var myArr = [1,5,8] myArr.forEach((v,i)=>{ console.log(v,i) })//运行后是这样的1 0 ...
- DES加密算法 转
1.什么是对称密码算法 网络安全通信中要用到两类密码算法,一类是对称密码算法,另一类是非对称密码算法.对称密码算法有时又叫传统密码算法.秘密密钥算法或单密钥算法,非对称密码算法也叫公开密钥密码算法或双 ...
- 图的最短路径算法-- Floyd算法
Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...
- java课后作业2
动手动脑 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 import java.util.Random;import java.util.Scanner;public class ...
- \r、\n、\r\n的区别-转载
文章地址: https://blog.csdn.net/qq_40395278/article/details/81199281 https://blog.csdn.net/qq592304796/a ...
- CBE引擎概览
摘录于CBE官方文档:https://www.comblockengine.com/docs/1.0/overview/index/ 架构图总览: Switch Fabric:交换机网络,根据网络环境 ...
- Django路由层、视图层
一.路由匹配: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个后立即停止 urlpatterns = [ url(r'^admin/', admin.site.urls), url( ...