新聞中心
在上一節(jié)《 創(chuàng)建 .zip 歸檔文件》中我們介紹了 zip 歸檔文件的創(chuàng)建和讀取,那么接下來介紹一下 tar 歸檔文件的創(chuàng)建及讀取。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),黎川企業(yè)網(wǎng)站建設(shè),黎川品牌網(wǎng)站建設(shè),網(wǎng)站定制,黎川網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,黎川網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
創(chuàng)建 tar 歸檔文件
tar 是一種打包格式,但不對文件進(jìn)行壓縮,所以打包后的文檔一般遠(yuǎn)遠(yuǎn)大于 zip 和 tar.gz,因?yàn)椴恍枰獕嚎s的原因,所以打包的速度是非??斓?,打包時(shí) CPU 占用率也很低。
tar 的目的在于方便文件的管理,比如在我們的生活中,有很多小物品分散在房間的各個(gè)角落,為了方便整潔可以將這些零散的物品整理進(jìn)一個(gè)箱子中,而 tar 的功能就類似這樣。
創(chuàng)建 tar 歸檔文件與創(chuàng)建 .zip 歸檔文件非常類似,主要不同點(diǎn)在于我們將所有數(shù)據(jù)都寫入相同的 writer 中,并且在寫入文件的數(shù)據(jù)之前必須寫入完整的頭部,而非僅僅是一個(gè)文件名。
tar 打包實(shí)現(xiàn)原理如下:
- 創(chuàng)建一個(gè)文件 x.tar,然后向 x.tar 寫入 tar 頭部信息;
- 打開要被 tar 的文件,向 x.tar 寫入頭部信息,然后向 x.tar 寫入文件信息;
- 當(dāng)有多個(gè)文件需要被 tar 時(shí),重復(fù)第二步直到所有文件都被寫入到 x.tar 中;
- 關(guān)閉 x.tar,完成打包。
下面通過示例程序簡單演示一下Go語言 tar 打包的實(shí)現(xiàn):
package main
import (
"archive/tar"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Create("./output.tar") //創(chuàng)建一個(gè) tar 文件
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
tw := tar.NewWriter(f)
defer tw.Close()
fileinfo, err := os.Stat("./main.exe") //獲取文件相關(guān)信息
if err != nil {
fmt.Println(err)
}
hdr, err := tar.FileInfoHeader(fileinfo, "")
if err != nil {
fmt.Println(err)
}
err = tw.WriteHeader(hdr) //寫入頭文件信息
if err != nil {
fmt.Println(err)
}
f1, err := os.Open("./main.exe")
if err != nil {
fmt.Println(err)
return
}
m, err := io.Copy(tw, f1) //將main.exe文件中的信息寫入壓縮包中
if err != nil {
fmt.Println(err)
}
fmt.Println(m)
}運(yùn)行上面的代碼會在當(dāng)前目錄下生成一個(gè) output.tar 文件,如下圖所示:
圖:生成的 output.tar 文件
解壓 tar 歸檔文件
解壓 tar 歸檔文件比創(chuàng)建 tar 歸檔文檔稍微簡單些。首先需要將其打開,然后從這個(gè) tar 頭部中循環(huán)讀取存儲在這個(gè)歸檔文件內(nèi)的文件頭信息,從這個(gè)文件頭里讀取文件名,以這個(gè)文件名創(chuàng)建文件,然后向這個(gè)文件里寫入數(shù)據(jù)即可。
示例代碼如下所示:
package main
import (
"archive/tar"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("output.tar")
if err != nil {
fmt.Println("文件打開失敗", err)
return
}
defer f.Close()
r := tar.NewReader(f)
for hdr, err := r.Next(); err != io.EOF; hdr, err = r.Next() {
if err != nil {
fmt.Println(err)
return
}
fileinfo := hdr.FileInfo()
fmt.Println(fileinfo.Name())
f, err := os.Create("123" + fileinfo.Name())
if err != nil {
fmt.Println(err)
}
defer f.Close()
_, err = io.Copy(f, r)
if err != nil {
fmt.Println(err)
}
}
}運(yùn)行上面的程序會將 tar 包的文件解壓到當(dāng)前目錄中,如下圖所示:
圖:解壓 tar 包
至此,我們完成了對壓縮和歸檔文件及常規(guī)文件處理的介紹。Go語言使用 io.Reader、io.ReadCloser、io.Writer 和 io.WriteCloser 等接口處理文件的方式讓開發(fā)者可以使用相同的編碼模式來讀寫文件或者其他流(如網(wǎng)絡(luò)流或者甚至是字符串),從而大大降低了難度。
名稱欄目:創(chuàng)新互聯(lián)GO教程:Go語言tar歸檔文件的讀寫操作
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/copcoii.html


咨詢
建站咨詢
