在Go中復(fù)制文件最流行的3種方法
本文將向您展示如何在GO編程語(yǔ)言。盡管Go中有三種以上的復(fù)制文件的方法,但本文將介紹三種最常見的方法:這三種方法各有利弊,我們只需要在應(yīng)用中選擇最合適的即可,不必盲目追求性能。
使用io.Copy()從GO庫(kù)調(diào)用函數(shù);一次性讀取輸入文件并將其寫入另一個(gè)文件;并使用緩沖區(qū)以小塊的形式復(fù)制文件。
方法1:使用io.Copy()
該實(shí)用程序的第一個(gè)版本將使用io.Copy()標(biāo)準(zhǔn)GO庫(kù)的功能。實(shí)現(xiàn)中可以找到實(shí)用程序的邏輯。copy()職能如下:

除了測(cè)試要復(fù)制的文件是否存在外(os.Stat(src)),并且是一個(gè)常規(guī)文件(sourceFileStat.Mode().IsRegular())這樣您就可以打開它閱讀,所有的工作都是由io.Copy(destination, source)聲明。這,這個(gè),那,那個(gè)io.Copy()函數(shù)返回復(fù)制的字節(jié)數(shù)和復(fù)制過程中發(fā)生的第一條錯(cuò)誤消息。在Go中,如果沒有錯(cuò)誤消息,則錯(cuò)誤變量的值將為nil.
您可以了解更多關(guān)于io.Copy()在IO封裝文件頁(yè)。
執(zhí)行cp1.go將生成下一種輸出:
$ run cp1 Please provide two command line arguments $ run cp1 fileCPtxt tmpfileCPCOPY Copied bytes $ diff fileCPtxt tmpfileCPCOPY
這種技術(shù)盡可能簡(jiǎn)單,但不給開發(fā)人員帶來(lái)靈活性,這并不總是一件壞事。但是,有時(shí)開發(fā)人員需要或希望決定如何讀取文件。
方法2:使用ioutil.WriteFile()和ioutil.ReadFile()
復(fù)制文件的第二種方法是使用ioutil.ReadFile()和ioutil.WriteFile()職能。第一個(gè)函數(shù)將整個(gè)文件的內(nèi)容讀入字節(jié)片,第二個(gè)函數(shù)將字節(jié)片的內(nèi)容寫入文件中。
實(shí)用程序的邏輯可以在以下GO代碼中找到:

除了這兩個(gè)if塊,它們是工作方式的一部分,您可以看到程序的功能在ioutil.ReadFile()和ioutil.WriteFile()陳述。
執(zhí)行cp2.go將生成下一種輸出:
$ run cp2 Please provide two command line arguments $ run cp2 fileCPtxt tmpcopyFileCP $ diff fileCPtxt tmpcopyFileCP
請(qǐng)注意,盡管此技術(shù)將復(fù)制一個(gè)文件,但是當(dāng)您想要復(fù)制大型文件時(shí),它可能并不有效,因?yàn)閕outil.ReadFile()也將是巨大的。
方法3:使用os.Read()和os.Write()
在GO中復(fù)制文件的第三種方法是使用cp3.go將在本節(jié)中開發(fā)的實(shí)用程序。它接受三個(gè)參數(shù):輸入文件的文件名、輸出文件的文件名和緩沖區(qū)的大小。
最重要的部分cp3.go駐留在以下for循環(huán),可以在copy() function:

這種技術(shù)使用os.Read()用于將輸入文件的一小部分讀入名為buf和os.Write()將緩沖區(qū)的內(nèi)容寫入文件。當(dāng)讀取錯(cuò)誤或到達(dá)文件末尾時(shí),復(fù)制過程停止(io.EOF).
執(zhí)行cp3.go將生成下一種輸出:
$ run cp3 usage cp3 source destination BUFFERSIZE $ run cp3 fileCPtxt tmpbuf10 Copying fileCPtxt to tmpbuf10 $ run cp3 fileCPtxt tmpbuf20 Copying fileCPtxt to tmpbuf20
如您所見,緩沖區(qū)的大小極大地影響了cp3.go.
做一些基準(zhǔn)
本文的最后一部分將嘗試比較這三個(gè)程序以及cp3.go對(duì)于不同的緩沖區(qū)大小,請(qǐng)使用time(1)命令行實(shí)用程序。
下面的輸出顯示了cp1.go, cp2.go,和cp3.go復(fù)制500 MB文件時(shí):

輸出結(jié)果表明,這三個(gè)實(shí)用程序的性能非常相似,這意味著標(biāo)準(zhǔn)GO庫(kù)的功能非常聰明和優(yōu)化。
現(xiàn)在,讓我們測(cè)試緩沖區(qū)大小如何影響cp3.go。執(zhí)行cp3.go如果緩沖區(qū)大小為10、20和1,000字節(jié),以便在相當(dāng)快的計(jì)算機(jī)上復(fù)制500MB文件,生成的輸出顯示,緩沖區(qū)越大,cp3.go實(shí)用程序,這或多或少是預(yù)期的。此外,使用小于20個(gè)字節(jié)的緩沖區(qū)大小復(fù)制大文件是一個(gè)非常緩慢的過程,應(yīng)該避免。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Go語(yǔ)言開發(fā)環(huán)境搭建與初探(Windows平臺(tái)下)
Go是Google開發(fā)的一種編譯型,並發(fā)型,并具有垃圾回收功能的編程語(yǔ)言,可能很多人想學(xué)習(xí)go語(yǔ)言,那么首先就要了解go語(yǔ)言的環(huán)境配置方法2014-10-10
go-zero數(shù)據(jù)的流處理利器fx使用詳解
這篇文章主要為大家介紹了go-zero數(shù)據(jù)的流處理利器fx使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Go?Gin框架優(yōu)雅重啟和停止實(shí)現(xiàn)方法示例
Web應(yīng)用程序中,有時(shí)需要重啟或停止服務(wù)器,無(wú)論是因?yàn)楦麓a還是進(jìn)行例行維護(hù),這時(shí)需要保證應(yīng)用程序的可用性和數(shù)據(jù)的一致性,就需要優(yōu)雅地關(guān)閉和重啟應(yīng)用程序,即不丟失正在處理的請(qǐng)求和不拒絕新的請(qǐng)求,本文將詳解如何在Go語(yǔ)言中使用Gin這個(gè)框架實(shí)現(xiàn)優(yōu)雅的重啟停止2024-01-01
使用Go語(yǔ)言中的Context取消協(xié)程執(zhí)行的操作代碼
在 Go 語(yǔ)言中,協(xié)程(goroutine)是一種輕量級(jí)的線程,非常適合處理并發(fā)任務(wù),然而,如何優(yōu)雅地取消正在運(yùn)行的協(xié)程是一個(gè)常見的問題,本文將通過一個(gè)具體的例子來(lái)展示如何使用 context 包來(lái)取消協(xié)程的執(zhí)行,需要的朋友可以參考下2024-11-11

