Edited at

Go 標準ライブラリ tar パッケージの使い方


tar ファイルの書き込み

書き込むには,まず, Writer.WriteHeader でヘッダを書き込みます。

ヘッダには,最低限,Name(ファイル名)とSize(ファイルサイズ)を指定します。

なぜなら,Sizeを超えた内容を書き込むとエラーとなるため,Sizeを指定しないとファイル内容を全く書き込めません。

Sizeは,int64(len(ファイル内容))で指定するのが最も確実で簡単です。

    var buf bytes.Buffer

tw := tar.NewWriter(&buf)
body := "ファイル内容"
// ヘッダ
hdr := &tar.Header{
Name: "ファイル名",
Size: int64(len(body)),
}
// ヘッダを書き込む
if err := tw.WriteHeader(hdr); err != nil {
log.Fatal(err)
}
// ファイル内容を書き込む
if _, err := tw.Write([]byte(body)); err != nil {
log.Fatal(err)
}
// 閉じる
if err := tw.Close(); err != nil {
log.Fatal(err)
}

複数のファイルを書き込む場合,WriteHeader と Write を繰り返します。

最後に, Close を呼び出して閉じます。


tar ファイルの読み込み

Reader の Next() を呼び出して, tar ファイル内の複数のファイルに一つずつアクセスします。

Next() でヘッダを読み込めます。

Reader は, io.Reader インターフェースを実装しているので,通常のファイルを読み込むのと同じように Reader が使えます。

tr := tar.NewReader(&buf)

for {
hdr, err := tr.Next() // 最初のファイルを読み込む時にも,Next()を呼び出す必要がある。
if err == io.EOF {
break // アーカイブの終わり
}
if err != nil {
log.Fatal(err)
}
// hdr.Name がファイル名
// tr が io.Reader インターフェースを満たしているので, tr をそのまま使ってファイル内容を読み込む。
}


参考

archive/tar パッケージ

Package archive/tar