import "archive/tar"

tarアーカイブへのアクセスを実装しています。GNUやBSDを含むほとんどのバリエーションをカバーすることを目指しています。

リファレンス:

http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5
http://www.gnu.org/software/tar/manual/html_node/Standard.html

パッケージファイル

common.go reader.go writer.go

定数

const (

    // 型
    TypeReg           = '0'
    TypeRegA          = '\x00'
    TypeLink          = '1'
    TypeSymlink       = '2'
    TypeChar          = '3'
    TypeBlock         = '4'
    TypeDir           = '5'
    TypeFifo          = '6'
    TypeCont          = '7'
    TypeXHeader       = 'x'
    TypeXGlobalHeader = 'g'
)

変数

var (
    ErrWriteTooLong    = os.NewError("write too long")
    ErrFieldTooLong    = os.NewError("header field too long")
    ErrWriteAfterClose = os.NewError("write after close")
)
var (
    HeaderError os.Error = os.ErrorString("invalid tar header")
)

Header型

tarアーカイブ内の単一ヘッダを表します。いくつかのフィールドは使われないかもしれません。

type Header struct {
    Name     string
    Mode     int64
    Uid      int
    Gid      int
    Size     int64
    Mtime    int64
    Typeflag byte
    Linkname string
    Uname    string
    Gname    string
    Devmajor int64
    Devminor int64
    Atime    int64
    Ctime    int64
}

Reader型

tarアーカイブ内へのシーケンシャルアクセスを提供します。tarアーカイブは連続したファイルで構成されています。Nextメソッドでアーカイブ内の次ファイル(先頭も含む)へ移動します。また、この型はファイルデータへアクセスするio.Readerとして扱うことができます。

例:

tr := tar.NewReader(r)
for {
	hdr, err := tr.Next()
	if err != nil {
		// handle error
	}
	if hdr == nil {
		// end of tar archive
		break
	}
	io.Copy(data, tr)
}

type Reader struct {
    // contains unexported fields
}

NewReader関数

func NewReader(r io.Reader) *Reader

NewReaderは、rから読み込みを行う新しいReaderを作成します。

(*Reader) Next関数

func (tr *Reader) Next() (*Header, os.Error)

Nextは、tarアーカイブ内の次のエントリへ移動します。

(*Reader) Read関数

func (tr *Reader) Read(b []byte) (n int, err os.Error)

Readは、tarアーカイブ内のカレントエントリから読み込みを行います。エントリの最後に達したときに0, os.EOFを返すので、それまでNextを呼び出して次のエントリへ進めてください。

Writer型

POSIX.1 tarアーカイブ形式のシーケンシャルな書き込みを提供します。tarアーカイブは連続したファイルで構成されています。新規ファイルを作成するには、まずWriteHeaderを呼び出したあと、Writeを呼び出してファイルデータを書き込みます。書き込み可能なサイズはhdr.Sizeに指定したバイト数以下です。

例:

tw := tar.NewWriter(w)
hdr := new(Header)
hdr.Size = length of data in bytes
// populate other hdr fields as desired
if err := tw.WriteHeader(hdr); err != nil {
	// handle error
}
io.Copy(tw, data)
tw.Close()

type Writer struct {
    // contains unexported fields
}

NewWriter関数

func NewWriter(w io.Writer) *Writer

NewWriterは、wに書き込みを行う新しいWriterを作成します。

(*Writer) Close関数

func (tw *Writer) Close() os.Error

Closeは、Writerがまだ書き込んでいないデータをフラッシュし、tarアーカイブをクローズします。

(*Writer) Flush関数

func (tw *Writer) Flush() os.Error

Flushは、カレントファイルの書き込みを終了します。(オプション)

(*Writer) Write関数

func (tw *Writer) Write(b []byte) (n int, err os.Error)

Writeは、tarアーカイブ内のカレントエントリに書き込みを行います。WriteHeader呼び出し後にhdr.Sizeに指定しているバイト数以上の書き込みを行うとErrWriteTooLongエラーを返します。

(*Writer) WriteHeader関数

func (tw *Writer) WriteHeader(hdr *Header) os.Error

WriteHeaderは、ファイル内容を書き込む準備としてhdrを書き込みます。最初のヘッダーではないときWriteHeaderはFlushを呼び出します。クローズ後に呼び出したときはErrWriteAfterCloseが返されます。