• 94_Go基础_1_62 断点续传


     1 package main
     2 
     3 import (
     4     "fmt"
     5     "io"
     6     "log"
     7     "os"
     8     "strconv"
     9     "strings"
    10 )
    11 
    12 func HandleErr(err error) {
    13     if err != nil {
    14         log.Fatal(err)
    15     }
    16 }
    17 
    18 func main() {
    19     /*
    20         断点续传:
    21             文件传递:文件复制
    22 
    23             "D:\\Go\\web2\\test.png"
    24 
    25             复制到当前的工程下:
    26 
    27         思路:边复制,边记录复制的总量
    28 
    29     */
    30 
    31     srcFile := "D:\\Go\\web2\\test.png"
    32     destFile := srcFile[strings.LastIndex(srcFile, "\\")+1:]
    33     fmt.Println(destFile) // test.png
    34 
    35     tempFile := destFile + "temp.txt"
    36     fmt.Println(tempFile) // test.pngtemp.txt
    37 
    38     file1, err := os.Open(srcFile)
    39     HandleErr(err)
    40     file2, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY, os.ModePerm)
    41     HandleErr(err)
    42     file3, err := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
    43     HandleErr(err)
    44 
    45     defer file1.Close()
    46     defer file2.Close()
    47 
    48     // step1:先读取临时文件中的数据,再seek
    49     file3.Seek(0, io.SeekStart)
    50     bs := make([]byte, 100, 100)
    51     n1, err := file3.Read(bs)
    52     // HandleErr(err)
    53     countStr := string(bs[:n1])
    54     fmt.Println("countstr: ", countStr)
    55     count, err := strconv.ParseInt(countStr, 10, 64)
    56     // HandleErr(err)
    57     fmt.Println("count: ", count)
    58 
    59     //step2:设置读,写的位置:
    60     file1.Seek(count, io.SeekStart)
    61     file2.Seek(count, io.SeekStart)
    62     data := make([]byte, 1024, 1024)
    63     n2 := -1            // 读取的数据量
    64     n3 := -1            // 写入的数据量
    65     total := int(count) // 读取的总量
    66 
    67     //step3:复制文件
    68     for {
    69         n2, err = file1.Read(data)
    70         if err == io.EOF || n2 == 0 {
    71             fmt.Println("文件复制完毕。。", total)
    72             file3.Close()
    73             os.Remove(tempFile)
    74             break
    75         }
    76         n3, err = file2.Write(data[:n2])
    77         total += n3
    78 
    79         // 将复制的总量,存储到临时文件中
    80         file3.Seek(0, io.SeekStart)
    81         file3.WriteString(strconv.Itoa(total))
    82 
    83         fmt.Printf("total:%d\n", total)
    84 
    85         // 假装断电
    86         if total > 8000 {
    87             panic("假装断电了。。。")
    88         }
    89 
    90     }
    91 
    92 }
  • 相关阅读:
    Tomcat8 配置Oracle11g数据源
    通过代码设置 为横屏
    HttpClient4.3.6 实现https访问
    创建mysql数据库
    设置android状态栏颜色和toolbar颜色一致
    定义任务打印gradle下载的jar包位置
    修改weblogic jvm启动参数
    android.support.v7.widget.Toolbar 中menu图标不显示问题
    android.support.design.widget.AppBarLayout 在android5.0+底部显示空白条问题
    浅析jQuery框架与构造对象
  • 原文地址:https://www.cnblogs.com/luwei0915/p/15661425.html
Copyright © 2020-2023  润新知