go語言tar包封裝

2021-10-07 00:14:24 字數 3022 閱讀 8538

// 將檔案或目錄打包成 .tar 檔案

// src 是要打包的多個資料夾或者多個檔案

// dsttar 是要生成的 .tar 檔案的路徑

// failifexist 標記如果 dsttar 檔案存在,是否放棄打包,如果否,則會覆蓋已存在的檔案

func

tar(srcs [

]string

, dsttar string

, failifexist bool

)(err error

)else}}

// 建立空的目標檔案

fw, er := os.

create

(dsttar)

if er !=

nildefer fw.

close()

// 建立 tar.writer,執行打包操作

tw := tar.

newwriter

(fw)

defer

func()

}()for

_, src :=

range srcs

// 獲取檔案或目錄資訊

fi, er := os.

stat

(src)

if er !=

nil// 獲取要打包的檔案或目錄的所在位置和名稱

srcbase, srcrelative := path.

split

(path.

clean

(src)

)// 開始打包

if fi.

isdir()

else

}return

nil}

func

untar

(srctar string

, dstdir string

)(err error

)defer fr.

close()

// 建立 tar.reader,準備執行解包操作

tr := tar.

newreader

(fr)

// 遍歷包中的檔案

for hdr, er := tr.

next()

; er != io.eof; hdr, er = tr.

next()

// 獲取檔案資訊

fi := hdr.

fileinfo()

// 獲取絕對路徑

dstfullpath := dstdir + hdr.name

if hdr.typeflag == tar.typedir

else

// 設定檔案許可權

os.chmod

(dstfullpath, fi.

mode()

.perm()

)}}return

nil}

// 因為要執行遍歷操作,所以要單獨建立乙個函式

func

tardir

(srcbase, srcrelative string

, tw *tar.writer, fi os.fileinfo)

(err error

)// 獲取 srcfull 下的檔案或子目錄列表

fis, er := ioutil.

readdir

(srcfull)

if er !=

nil// 開始遍歷

for_

, fi :=

range fis

else

}// 寫入目錄資訊

iflen

(srcrelative)

>

0 hdr.name = srcrelative

if er = tw.

writeheader

(hdr)

; er !=

nil}

return

nil}

// 因為要在 defer 中關閉檔案,所以要單獨建立乙個函式

func

tarfile

(srcbase, srcrelative string

, tw *tar.writer, fi os.fileinfo)

(err error

) hdr.name = srcrelative

if er = tw.

writeheader

(hdr)

; er !=

nil// 開啟要打包的檔案,準備讀取

fr, er := os.

open

(srcfull)

if er !=

nildefer fr.

close()

// 將檔案資料寫入 tw 中if_

, er = io.

copy

(tw, fr)

; er !=

nilreturn

nil}

// 因為要在 defer 中關閉檔案,所以要單獨建立乙個函式

func

untarfile

(dstfile string

, tr *tar.reader)

error

defer fw.

close()

// 寫入解包後的資料

_, er = io.

copy

(fw, tr)

if er !=

nilreturn

nil}

// 判斷檔案是否存在

func

exists

(name string

)bool

// 判斷檔案是否存在

func

fileexists

(filename string

)bool

// 判斷目錄是否存在

func

direxists

(dirname string

)bool

go語言 物件導向之包和封裝 十一

封裝 1.名字一般使用camelcase 2.首字母大寫 public 3.首字母小寫 private 包1.為結構定義的方法必須放在同乙個包內 2.可以是不同檔案 package queues type quene int func q quene addquene val int func q ...

Go學習 11 包和封裝

這裡的公有和私有是針對包來說的 記住 乙個資料夾就是乙個包 乙個包裡的所有檔案的開頭都是一樣的package 包名 包名一般就是檔名,main函式所在的包除外,當然也可以不一樣 大寫字母開頭的元素可以匯出到其它包中使用。乙個包裡的檔案之間相互引用匯出的屬性 變數 函式等,是不需要import的 引用...

c語言提取tar包內容

tar檔案 以一定方式將多個檔案合併成tar檔案,不對檔案進行壓縮,tar檔案格式 很 簡單,每個檔案前面 512位元組的header,並且將所有檔案疊放在一起 header1 file1 header2 file2 header3 file3 解包就是讀取檔案頭得到檔案大小,然後讀取出檔案就行了 ...