archive/tar

import "archive/tar"

简介

tar包实现了访问tar归档文件的方法。

概览

tar包实现了访问tar归档文件的方法。该包目标覆盖各种变种,包括GNU和BSD的tar归档文件。

参考:

http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5
http://www.gnu.org/software/tar/manual/html_node/Standard.html
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html

内容

常量

const (
        // 文件类型
        TypeReg           = '0'    // 常规文件
        TypeRegA          = '\x00' // 常规文件
        TypeLink          = '1'    // 硬链接
        TypeSymlink       = '2'    // 符号链接
        TypeChar          = '3'    // 字符设备节点
        TypeBlock         = '4'    // 块设备节点
        TypeDir           = '5'    // 目录
        TypeFifo          = '6'    // 先入先出节点
        TypeCont          = '7'    // 保留
        TypeXHeader       = 'x'    // 扩展头部
        TypeXGlobalHeader = 'g'    // 全局扩展头部
        TypeGNULongName   = 'L'    // 下一个文件文件名很长
        TypeGNULongLink   = 'K'    // 下一个符号链接链接到的文件名称很长
        TypeGNUSparse     = 'S'    // 稀疏文件
)

变量

var (
        // 写入内容太长错误
        ErrWriteTooLong    = errors.New("archive/tar: write too long")
        // 头部内容太长错误
        ErrFieldTooLong    = errors.New("archive/tar: header field too long")
        // 在关闭文件后写入错误
        ErrWriteAfterClose = errors.New("archive/tar: write after close")
)

var (
        // 非法头部错误
        ErrHeader = errors.New("archive/tar: invalid tar header")
)

type Header

type Header struct {
        Name       string    // 头部名称,一般设置为文件名全路径
        Mode       int64     // 权限和模式位
        Uid        int       // 用户id
        Gid        int       // 用户组id
        Size       int64     // 按字节表示长度
        ModTime    time.Time // 修改时间
        Typeflag   byte      // 头部条目类型
        Linkname   string    // 链接的目标名称
        Uname      string    // 用户名
        Gname      string    // 用户组名
        Devmajor   int64     // 字符或块主设备号
        Devminor   int64     // 字符或块次设备号
        AccessTime time.Time // 访问时间
        ChangeTime time.Time // 状态改变时间
        Xattrs     map[string]string
}

头部表示一个tar归档文件的一个头部信息。头部信息的一些域可以不填充数据。

func FileInfoHeader

func FileInfoHeader(fi os.FileInfo, link string) (*Header, error)

FileInfoHeader根据fi创建一个域部分填充的头部。如果fi表示一个符号链接的话,FileInfoHeader就把链接当作链接目标。如果fi是一个目录的话,文件名称会被追加一个斜杠(/)。因为os.FileInfo的方法Name()返回的是文件的短文件名,而不是全路径,所以可能需要修改返回的tar头部的Name域,以提供一个文件的全路径。

func (*Header) FileInfo

func (h *Header) FileInfo() os.FileInfo

FileInfo 返回一个tar头部的os.FileInfo信息。

type Reader

type Reader struct {
        // 包含过滤掉的或未导出的域
}

Reader提供了对一个tar归档文件内容的顺序访问。一个tar归档文件由一系列文件组成。Next()方法指向归档文件中的每个文件(包括第一个文件)的开始处,然后就可以使用io.Reader来访问文件的数据。

func NewReader

func NewReader(r io.Reader) *Reader

NewReader()方法从一个io.Reader创建一个新的tar的Reader。

func (*Reader) Next

func (tr *Reader) Next() (*Header, error)

Next()方法指向tar归档文件中的下一个文件(包括第一个文件)的开始处。

func (*Reader) Read

func (tr *Reader) Read(b []byte) (n int, err error)

Read()方法从当前指向的tar归档文件中的文件的开始处读取数据。当读取到当前文件的末尾时,它返回0和io.EOF。当Next()再被调用时,重新从下一个文件的开始处读取数据。

type Writer

type Writer struct {
        // 包含过滤掉的或未导出的域
}

Writer提供了对tar归档文件(POSIX.1格式)内容的顺序写入。tar归档文件由一系列文件组成。调用WriteHeader来开始创建一个新文件,然后调用Write方法来将数据写入文件中,一共可以写入最多hdr.Size个字节。

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter()方法创建一个向io.Writer写入数据的tar的Writer。

func (*Writer) Close

func (tw *Writer) Close() error

Close()方法关闭tar归档文件,将所有没有写入到底层writer的数据写入。

func (*Writer) Flush

func (tw *Writer) Flush() error

Flush()方法结束写入数据到当前文件(可选)。

func (*Writer) Write

func (tw *Writer) Write(b []byte) (n int, err error)

Writer()方法向tar归档文件中当前指向的文件写入数据。如果在调用WriteHeader()方法后写入文件的字节数大于hdr.Size的时候返回错误ErrWriteTooLong。

func (*Writer) WriteHeader

func (tw *Writer) WriteHeader(hdr *Header) error

WriterHeader()方法写入tar头部hdr,然后准备接收文件的内容。WriterHeeader()方法会调用Flush()方法,如果这不是第一个头部的话。在tar文件关闭之后调用该方法会返回ErrWriteAfterClose错误。