Golang實現斷點續傳功能

本文實例為大傢分享瞭Golang實現斷點續傳的具體代碼,供大傢參考,具體內容如下

1、將文件pic_src.jpg復制到pic_des.jpg文件;

2、讀寫過程中斷時,讀寫的中斷位置會記錄在“pic_des.jpgtemp.txt”文件裡;

3、下次再啟動程序時,程序會接著“pic_des.jpgtemp.txt”文件裡記錄的中斷位置,繼續讀、寫文件,直到完成傳輸;

具體代碼實現,如下:

package main
 
import (
    "fmt"
    "os"
    "strconv"
    "io"
    "log"
    //"time"
)
 
func main() {
    /*
    斷點續傳:
        文件傳遞:文件復制
        srcFile 復制到 destFile
    思路:
        邊復制,邊記錄復制的總量(記錄總復制字節數保存至tempFile)
        復制一半中斷後,若再次復制,會先讀取tempFile文件裡記錄的已完成字節總數
        然後將這個字節數作為文件讀寫offset(偏移量),
        來結合whence(偏移位置)來決定後面讀寫文件的起點位置。
        seek(offset,whence),設置指針光標的位置
        第一個參數:偏移量
        第二個參數:如何設置
            0:seekStart表示相對於文件開始,
            1:seekCurrent表示相對於當前偏移量,
            2:seek end表示相對於結束。
     */
 
    srcFile:="./0731/ddxc/pic_src.jpg"
    destFile:="./0731/ddxc/pic_des.jpg"
    tempFile:=destFile+"temp.txt"
    file1,err:=os.Open(srcFile)
    if err !=nil {
        log.Fatalln(err)
    }
    file2,_:=os.OpenFile(destFile,os.O_CREATE|os.O_WRONLY,os.ModePerm)
    file3,_:=os.OpenFile(tempFile,os.O_CREATE|os.O_RDWR,os.ModePerm)
 
    defer file1.Close()
    defer file2.Close()
    //1.讀取臨時文件中的數據,根據seek
    file3.Seek(0,io.SeekStart)
    bs:=make([]byte,100,100)
    n1,err:=file3.Read(bs)
    fmt.Println(n1)
    countStr:=string(bs[:n1])
    fmt.Println(countStr)
    count,_:=strconv.ParseInt(countStr,10,64)
    fmt.Println(count)
 
    //2. 設置讀,寫的偏移量
    file1.Seek(count,0) // 設置file1下一次讀或者寫的起點
    file2.Seek(count,0) // 設置file2下一次讀或者寫的起點
    data:=make([]byte,1024,1024)
    n2:=-1// 讀取的數據量, 默認值
    n3:=-1//寫出的數據量
    total :=int(count)//讀取的總量
 
    for{
        //3.讀取數據
        // 基於上面的起點,讀取file1文件len(data)個字節,
        // n2:實際讀取的字節數(小於等於len(data),將讀取的字節存入data。
        n2,err=file1.Read(data)
        if err ==io.EOF{
            fmt.Println("文件復制完畢。。")
            file3.Close()
            //os.Remove(tempFile) //復制完,先不刪除,驗證最後存儲的字節總數是不是跟復制的文件大小一致。
            break
        }
        //將數據寫入到目標文件
        // 基於上面的起點,向file2文件寫入len(data[:n2])個字節,也就是寫入data中前n2個元素;
        // n3:實際寫入的字節數(小於等於n2)。
        n3,_=file2.Write(data[:n2])
        total += n3
        //將復制總量,存儲到臨時文件中
        file3.Seek(0,io.SeekStart) // 設置file3的下次讀寫起點為源點:0點,即覆蓋重寫。
        file3.WriteString(strconv.Itoa(total))
 
        //假裝斷電
        //if total>1800000{
        //  panic("假裝斷電瞭。。。,假裝的。。。")
        //}
    }
}

 4、檢驗下: 當文件復制完成後,pic_des.jpgtemp.txt文件裡保存的字節數剛好等於傳輸文件大小,說明文件完整復制。

如下圖:

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: