// 將檔案或目錄打包成 .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 解包就是讀取檔案頭得到檔案大小,然後讀取出檔案就行了 ...