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 をそのまま使ってファイル内容を読み込む。
}