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. linux 安装 setuptools

    wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar ...

  2. 树莓派操作案例1-使用python GPIO+TB6612驱动步进电机

    原理图: 接口说明 A控制信号输入------PWMA               VM ------电机驱动电压输入端(4.5V-15V) A电机输入端2 ------AIN2           ...

  3. python笔记-02

    Python基础知识 —————————————— A,B,先把A乘以3,然后加上B,最后在加上列表A A = [1, 2, 3, 4, 5, 6] 赋值 B = [1, 2, 3] 变量 定义一个变 ...

  4. 二分-C - Pie

    C - Pie My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a n ...

  5. wpf 程序启动显示图片

    一.设置图片的生成操作 程序启动时会出现0.5秒的图片显示,再显示程序界面. 二.写代码实现相同效果 /// <summary> /// App.xaml 的交互逻辑 /// </s ...

  6. JS高级---正则表达式其他方法的使用

    正则表达式其他方法的使用 正则表达式中:g 表示的是全局模式匹配 正则表达式中:i 表示的是忽略大小写 var str = "中国移动:10086,中国联通:10010,中国电信:10000 ...

  7. CodeForces - 645 C.Enduring Exodus

    快乐二分 用前缀和随便搞一下 #include <cstdio> using namespace std; ; int p[N]; ; inline int msum(int a, int ...

  8. [SHOI2016] 黑暗前的幻想乡 - 矩阵树定理,容斥

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 20; const in ...

  9. python使用临时文件

    # 需求 # 某项目中,我们从传感器中采集数据,没采集1G数据后,做数据分析,最终只保存分析结果 # 这样很大的临时文件如果常驻在内存,将消耗大量地内存资源,我们可以使用临时文件储存(外部储存) # ...

  10. js -- 操作sqlite数据库

    最近看到一个使用js来操作sqlite数据库的,测试了一下,具体使用的是 js操作类: https://github.com/kripken/sql.js/(sqlite js 驱动) 异步请求:ht ...