溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

發(fā)布時間:2022-07-27 09:49:21 來源:億速云 閱讀:181 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“怎么使用Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“怎么使用Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能”文章能幫助大家解決問題。

1、將文件pic_src.jpg復(fù)制到pic_des.jpg文件;

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

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

具體代碼實(shí)現(xiàn),如下:

package main
 
import (
    "fmt"
    "os"
    "strconv"
    "io"
    "log"
    //"time"
)
 
func main() {
    /*
    斷點(diǎn)續(xù)傳:
        文件傳遞:文件復(fù)制
        srcFile 復(fù)制到 destFile
    思路:
        邊復(fù)制,邊記錄復(fù)制的總量(記錄總復(fù)制字節(jié)數(shù)保存至tempFile)
        復(fù)制一半中斷后,若再次復(fù)制,會先讀取tempFile文件里記錄的已完成字節(jié)總數(shù)
        然后將這個字節(jié)數(shù)作為文件讀寫offset(偏移量),
        來結(jié)合whence(偏移位置)來決定后面讀寫文件的起點(diǎn)位置。
        seek(offset,whence),設(shè)置指針光標(biāo)的位置
        第一個參數(shù):偏移量
        第二個參數(shù):如何設(shè)置
            0:seekStart表示相對于文件開始,
            1:seekCurrent表示相對于當(dāng)前偏移量,
            2:seek end表示相對于結(jié)束。
     */
 
    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.讀取臨時文件中的數(shù)據(jù),根據(jù)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. 設(shè)置讀,寫的偏移量
    file1.Seek(count,0) // 設(shè)置file1下一次讀或者寫的起點(diǎn)
    file2.Seek(count,0) // 設(shè)置file2下一次讀或者寫的起點(diǎn)
    data:=make([]byte,1024,1024)
    n2:=-1// 讀取的數(shù)據(jù)量, 默認(rèn)值
    n3:=-1//寫出的數(shù)據(jù)量
    total :=int(count)//讀取的總量
 
    for{
        //3.讀取數(shù)據(jù)
        // 基于上面的起點(diǎn),讀取file1文件len(data)個字節(jié),
        // n2:實(shí)際讀取的字節(jié)數(shù)(小于等于len(data),將讀取的字節(jié)存入data。
        n2,err=file1.Read(data)
        if err ==io.EOF{
            fmt.Println("文件復(fù)制完畢。。")
            file3.Close()
            //os.Remove(tempFile) //復(fù)制完,先不刪除,驗(yàn)證最后存儲的字節(jié)總數(shù)是不是跟復(fù)制的文件大小一致。
            break
        }
        //將數(shù)據(jù)寫入到目標(biāo)文件
        // 基于上面的起點(diǎn),向file2文件寫入len(data[:n2])個字節(jié),也就是寫入data中前n2個元素;
        // n3:實(shí)際寫入的字節(jié)數(shù)(小于等于n2)。
        n3,_=file2.Write(data[:n2])
        total += n3
        //將復(fù)制總量,存儲到臨時文件中
        file3.Seek(0,io.SeekStart) // 設(shè)置file3的下次讀寫起點(diǎn)為源點(diǎn):0點(diǎn),即覆蓋重寫。
        file3.WriteString(strconv.Itoa(total))
 
        //假裝斷電
        //if total>1800000{
        //  panic("假裝斷電了。。。,假裝的。。。")
        //}
    }
}

 4、檢驗(yàn)下: 當(dāng)文件復(fù)制完成后,pic_des.jpgtemp.txt文件里保存的字節(jié)數(shù)剛好等于傳輸文件大小,說明文件完整復(fù)制。

如下圖:

怎么使用Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

關(guān)于“怎么使用Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI