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 }