Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能
本文實(shí)例為大家分享了Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳的具體代碼,供大家參考,具體內(nèi)容如下
1、將文件pic_src.jpg復(fù)制到pic_des.jpg文件;
2、讀寫(xiě)過(guò)程中斷時(shí),讀寫(xiě)的中斷位置會(huì)記錄在“pic_des.jpgtemp.txt”文件里;
3、下次再啟動(dòng)程序時(shí),程序會(huì)接著“pic_des.jpgtemp.txt”文件里記錄的中斷位置,繼續(xù)讀、寫(xiě)文件,直到完成傳輸;
具體代碼實(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ù)制,會(huì)先讀取tempFile文件里記錄的已完成字節(jié)總數(shù) ?? ??? ?然后將這個(gè)字節(jié)數(shù)作為文件讀寫(xiě)offset(偏移量), ? ? ? ? 來(lái)結(jié)合whence(偏移位置)來(lái)決定后面讀寫(xiě)文件的起點(diǎn)位置。 ?? ??? ?seek(offset,whence),設(shè)置指針光標(biāo)的位置 ?? ??? ?第一個(gè)參數(shù):偏移量 ?? ??? ?第二個(gè)參數(shù):如何設(shè)置 ?? ??? ??? ?0:seekStart表示相對(duì)于文件開(kāi)始, ? ? ? ? ?? ?1:seekCurrent表示相對(duì)于當(dāng)前偏移量, ?? ? ? ? ? ?2:seek end表示相對(duì)于結(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í)文件中的數(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è)置讀,寫(xiě)的偏移量 ?? ?file1.Seek(count,0) // 設(shè)置file1下一次讀或者寫(xiě)的起點(diǎn) ?? ?file2.Seek(count,0) // 設(shè)置file2下一次讀或者寫(xiě)的起點(diǎn) ?? ?data:=make([]byte,1024,1024) ?? ?n2:=-1// 讀取的數(shù)據(jù)量, 默認(rèn)值 ?? ?n3:=-1//寫(xiě)出的數(shù)據(jù)量 ?? ?total :=int(count)//讀取的總量 ? ?? ?for{ ?? ??? ?//3.讀取數(shù)據(jù) ?? ??? ?// 基于上面的起點(diǎn),讀取file1文件len(data)個(gè)字節(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)證最后存儲(chǔ)的字節(jié)總數(shù)是不是跟復(fù)制的文件大小一致。 ?? ??? ??? ?break ?? ??? ?} ?? ??? ?//將數(shù)據(jù)寫(xiě)入到目標(biāo)文件 ?? ??? ?// 基于上面的起點(diǎn),向file2文件寫(xiě)入len(data[:n2])個(gè)字節(jié),也就是寫(xiě)入data中前n2個(gè)元素; ?? ??? ?// n3:實(shí)際寫(xiě)入的字節(jié)數(shù)(小于等于n2)。 ?? ??? ?n3,_=file2.Write(data[:n2]) ?? ??? ?total += n3 ?? ??? ?//將復(fù)制總量,存儲(chǔ)到臨時(shí)文件中 ?? ??? ?file3.Seek(0,io.SeekStart) // 設(shè)置file3的下次讀寫(xiě)起點(diǎn)為源點(diǎn):0點(diǎn),即覆蓋重寫(xiě)。 ?? ??? ?file3.WriteString(strconv.Itoa(total)) ? ?? ??? ?//假裝斷電 ?? ??? ?//if total>1800000{ ?? ??? ?// ?panic("假裝斷電了。。。,假裝的。。。") ?? ??? ?//} ?? ?} }
4、檢驗(yàn)下: 當(dāng)文件復(fù)制完成后,pic_des.jpgtemp.txt文件里保存的字節(jié)數(shù)剛好等于傳輸文件大小,說(shuō)明文件完整復(fù)制。
如下圖:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Golang http包構(gòu)建RESTful API的實(shí)現(xiàn)
在Go語(yǔ)言中實(shí)現(xiàn)RESTful API可以利用標(biāo)準(zhǔn)庫(kù)net/http提供的功能,它允許你輕松地創(chuàng)建和處理HTTP請(qǐng)求,本文主要介紹了Golang http包構(gòu)建RESTful API的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01Golang使用singleflight解決并發(fā)重復(fù)請(qǐng)求
高并發(fā)的場(chǎng)景下,經(jīng)常會(huì)出現(xiàn)并發(fā)重復(fù)請(qǐng)求資源的情況,singleflight是golang內(nèi)置的一個(gè)包,這個(gè)包提供了對(duì)重復(fù)函數(shù)調(diào)用的抑制功能,所以下面我們就來(lái)看看如何使用它解決并發(fā)重復(fù)請(qǐng)求吧2023-08-08Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go語(yǔ)言開(kāi)發(fā)快速學(xué)習(xí)CGO編程
這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)之快速學(xué)習(xí)CGO編程,看了本文你就會(huì)發(fā)現(xiàn)CGO編程其實(shí)沒(méi)有想象的那么難,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程
網(wǎng)上給出的使用delve進(jìn)行遠(yuǎn)程調(diào)試,都需要先在本地交叉編譯或者在遠(yuǎn)程主機(jī)上編譯出可運(yùn)行的程序,然后再用delve在遠(yuǎn)程啟動(dòng)程序,本教程會(huì)將上面的步驟簡(jiǎn)化為只需要兩步,1,在遠(yuǎn)程運(yùn)行程序2,在本地啟動(dòng)調(diào)試,需要的朋友可以參考下2024-08-08GoFrame代碼優(yōu)化gconv類型轉(zhuǎn)換避免重復(fù)定義map
這篇文章主要為大家介紹了GoFrame代碼優(yōu)化gconv類型轉(zhuǎn)換避免重復(fù)定義map示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Golang使用Gin框架實(shí)現(xiàn)HTTP上傳文件過(guò)程介紹
由于需求中有文件上傳這一個(gè)需求,在這里我們就學(xué)習(xí)一下go語(yǔ)言如何上傳文件。本文主要通過(guò)表單的方式進(jìn)行文件上傳操作,本文實(shí)例為大家分享了Go實(shí)現(xiàn)文件上傳操作的具體代碼,供大家參考,具體內(nèi)容如下2023-04-04Go應(yīng)該如何實(shí)現(xiàn)二級(jí)緩存
本文主要介紹了Go二級(jí)緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08