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

内容

常量

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

变量

  1. var (
  2. // 写入内容太长错误
  3. ErrWriteTooLong = errors.New("archive/tar: write too long")
  4. // 头部内容太长错误
  5. ErrFieldTooLong = errors.New("archive/tar: header field too long")
  6. // 在关闭文件后写入错误
  7. ErrWriteAfterClose = errors.New("archive/tar: write after close")
  8. )
  9. var (
  10. // 非法头部错误
  11. ErrHeader = errors.New("archive/tar: invalid tar header")
  12. )

type Header

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

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

func FileInfoHeader

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

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

func (*Header) FileInfo

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

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

type Reader

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

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

func NewReader

  1. func NewReader(r io.Reader) *Reader

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

func (*Reader) Next

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

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

func (*Reader) Read

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

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

type Writer

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

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

func NewWriter

  1. func NewWriter(w io.Writer) *Writer

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

func (*Writer) Close

  1. func (tw *Writer) Close() error

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

func (*Writer) Flush

  1. func (tw *Writer) Flush() error

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

func (*Writer) Write

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

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

func (*Writer) WriteHeader

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

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