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 }