文件复制(Go语言实现)

    科技2022-09-05  115

    在这里插package main import ( "fmt" "io" "os" "strconv" "time" ) type MyCopy struct{} func NewMyCopy() *MyCopy { return new(MyCopy) } //保存上次文件读取到的位置 var last string = "./last" /** * 功能:文件复制(支持断点续传) * Seek(offset int64, whence int) (ret int64, err error) 表示设置当前光标的位置 * offset int,设置多个字节 * whence int,从哪开始 0->距离文件开头 1->当前位置 2->距离文件末尾 * */ func (c *MyCopy) CopyFile(dstFile, srcFile string) (int, error) { src, err := os.Open(srcFile) if err != nil { fmt.Println("open srcFile failed: %v", err) return -1, err } des, err := os.OpenFile(dstFile, os.O_CREATE|os.O_WRONLY, 0775) if err != nil { fmt.Println("open desFile failed: %v", err) return -1, err } defer src.Close() defer des.Close() lastPos := c.GetLastPosition() position := 0 if lastPos > 0 { src.Seek(int64(lastPos), io.SeekStart) //0 des.Seek(int64(lastPos), io.SeekStart) //0 position = lastPos } fmt.Printf("当前读取位置为:%d\n", position) var buf [128]byte for { count, err := src.Read(buf[:]) if err == io.EOF { os.Remove(last) //文件拷贝结束,删除记录内容 break } if err != nil { fmt.Printf("read file context failed:%v\n", err) break } position += count fmt.Printf("copy cap:%d\r", position) time.Sleep(100 * time.Millisecond) //模拟网络延迟 des.Write(buf[:count]) c.WritePosition([]byte(fmt.Sprintf("%d", position))) /* if position == 10 { fmt.Println("模拟中断传输") break }*/ } fmt.Println("end============================================================") return position, nil } /* 获取上次断点位置 */ func (c *MyCopy) GetLastPosition() int { file, err := os.Open(last) if err != nil { return -1 } defer file.Close() var buff [128]byte n, err := file.Read(buff[:]) if err != nil { fmt.Println("Read lastfile failed: ", err) return -1 } v, err := strconv.Atoi(string(buff[0:n])) if err != nil || v < 0 { fmt.Println("Atoi error") return -1 } return v } /** * 写入当前读取到位置 */ func (c *MyCopy) WritePosition(v []byte) { //Write(b []byte) (n int, err error) file, err := os.OpenFile(last, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err != nil { fmt.Printf("write last position to failed:%v\n", err) return } file.Write(v) defer file.Close() } func main() {j c := NewMyCopy() c.CopyFile("a.txt", "employer.go") } 入代码片
    Processed: 0.013, SQL: 9