如题:
注释在代码中
package main
import (
"fmt"
"io"
"log"
"os"
"strconv"
"strings"
)
func main() {
//C:\Users\Administrator\go\src\breakpoint\point.jpg
//C:/Users/Administrator/Desktop/test.jpg
//srcFile := "C:/Users/Administrator/go/src/breakpoint/point.jpg"
//C:/Users/Administrator/Desktop/test.jpg
// 需要复制的源文件
srcFile := "C:/Users/Administrator/Desktop/test.jpg"
// 复制到的目标文件
destFile := srcFile[strings.LastIndex(srcFile, "/")+1:] //point.jpg
fmt.Println(destFile)
// 临时文件
tmpFiel := destFile + "temp.txt"
fmt.Println(tmpFiel)
// 打开源文件,只读用Open()
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(tmpFiel, os.O_CREATE|os.O_RDWR, os.ModePerm)
HandleErr(err)
defer file1.Close()
defer file2.Close()
//#1.先读取临时文件里面的数据,再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)
// #2.设置偏移量,读写位置
file1.Seek(count, io.SeekStart)
file2.Seek(count, io.SeekStart)
//读取文件数据量1024个字节
data := make([]byte, 1024, 1024)
n2 := -1 //读取的数据量
n3 := -1 //写出的数据量
total := int(count) //读取的总量
// #3.复制文件
for {
// 读取源文件,每次读1024个字节
n2, err = file1.Read(data)
if err == io.EOF || n2 == 0 {
fmt.Println("文件复制完毕...", total)
file3.Close()
os.Remove(tmpFiel)
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)
}
}
实现思路:
读取的字节数量,存放在一个临时文件中,当程序被中断,再次读取的时候,去临时文件中将那个数据拿到,从临时文件中存储的数据再次开始读取文件,读取完毕后,删除临时文件.
临时文件只是记录读取的位置