1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-27

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?