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 (
    // Types
    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");
)
var (
    HeaderError os.Error = os.ErrorString("invalid tar header");
)

Header型

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

type Header struct {
    Name     string;
    Mode     int64;
    Uid      int64;
    Gid      int64;
    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

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

(*Reader) Next関数

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

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

(*Reader) Read関数

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

Readはtarアーカイブ内のカレントエントリより読み込みを行います。エントリの最後に達した場合は0とnilを返すので、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

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

(*Writer) Close関数

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

(*Writer) Flush関数

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

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

(*Writer) Write関数

func (tw *Writer) Write(b []uint8) (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を呼び出します。