Spec-Zone.ru › Go

Пакет tar

  • import "archive/tar"
  • Обзор
  • Указатель
  • Примеры

Обзор

Пакет tar реализует доступ к tar-архивам.

Ленточные архивы (tar) — это формат файлов для хранения последовательности файлов, которые можно читать и записывать потоковым способом. Этот пакет призван поддерживать большинство вариантов формата, в том числе созданных инструментами tar GNU и BSD.

Пример (минимальный)

Код:

// Create and add some files to the archive.
var buf bytes.Buffer
tw := tar.NewWriter(&buf)
var files = []struct {
    Name, Body string
}{
    {"readme.txt", "This archive contains some text files."},
    {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
    {"todo.txt", "Get animal handling license."},
}
for _, file := range files {
    hdr := &tar.Header{
        Name: file.Name,
        Mode: 0600,
        Size: int64(len(file.Body)),
    }
    if err := tw.WriteHeader(hdr); err != nil {
        log.Fatal(err)
    }
    if _, err := tw.Write([]byte(file.Body)); err != nil {
        log.Fatal(err)
    }
}
if err := tw.Close(); err != nil {
    log.Fatal(err)
}

// Open and iterate through the files in the archive.
tr := tar.NewReader(&buf)
for {
    hdr, err := tr.Next()
    if err == io.EOF {
        break // End of archive
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Contents of %s:\n", hdr.Name)
    if _, err := io.Copy(os.Stdout, tr); err != nil {
        log.Fatal(err)
    }
    fmt.Println()
}

Вывод:

Contents of readme.txt:
This archive contains some text files.
Contents of gopher.txt:
Gopher names:
George
Geoffrey
Gonzo
Contents of todo.txt:
Get animal handling license.

Указатель

  • Константы
  • Переменные
  • тип FileInfoNames
  • тип Format
  • func (f Format) String() string
  • тип Header
  • func FileInfoHeader(fi fs.FileInfo, link string) (*Header, error)
  • func (h *Header) FileInfo() fs.FileInfo
  • тип Reader
  • func NewReader(r io.Reader) *Reader
  • func (tr *Reader) Next() (*Header, error)
  • func (tr *Reader) Read(b []byte) (int, error)
  • тип Writer
  • func NewWriter(w io.Writer) *Writer
  • func (tw *Writer) AddFS(fsys fs.FS) error
  • func (tw *Writer) Close() error
  • func (tw *Writer) Flush() error
  • func (tw *Writer) Write(b []byte) (int, error)
  • func (tw *Writer) WriteHeader(hdr *Header) error

Примеры

Пакет (минимальный)

Файлы пакета

common.go format.go reader.go stat_actime1.go stat_unix.go strconv.go writer.go

Константы

Флаги типов для Header.Typeflag.

const (
    // Type '0' indicates a regular file.
    TypeReg = '0'

    // Deprecated: Use TypeReg instead.
    TypeRegA = '\x00'

    // Type '1' to '6' are header-only flags and may not have a data body.
    TypeLink    = '1' // Hard link
    TypeSymlink = '2' // Symbolic link
    TypeChar    = '3' // Character device node
    TypeBlock   = '4' // Block device node
    TypeDir     = '5' // Directory
    TypeFifo    = '6' // FIFO node

    // Type '7' is reserved.
    TypeCont = '7'

    // Type 'x' is used by the PAX format to store key-value records that
    // are only relevant to the next file.
    // This package transparently handles these types.
    TypeXHeader = 'x'

    // Type 'g' is used by the PAX format to store key-value records that
    // are relevant to all subsequent files.
    // This package only supports parsing and composing such headers,
    // but does not currently support persisting the global state across files.
    TypeXGlobalHeader = 'g'

    // Type 'S' indicates a sparse file in the GNU format.
    TypeGNUSparse = 'S'

    // Types 'L' and 'K' are used by the GNU format for a meta file
    // used to store the path or link name for the next file.
    // This package transparently handles these types.
    TypeGNULongName = 'L'
    TypeGNULongLink = 'K'
)

Переменные

var (
    ErrHeader          = errors.New("archive/tar: invalid tar header")
    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")
    ErrInsecurePath    = errors.New("archive/tar: insecure file path")
)

тип FileInfoNames 1.23

FileInfoNames расширяет fs.FileInfo. Передача его экземпляра в FileInfoHeader позволяет вызывающему коду избежать зависящего от системы поиска имени, указав непосредственно Uname и Gname.

type FileInfoNames interface {
    fs.FileInfo
    // Uname should give a user name.
    Uname() (string, error)
    // Gname should give a group name.
    Gname() (string, error)
}

тип Format 1.10

Format представляет формат tar-архива.

Исходный формат tar был представлен в Unix V7. С тех пор появилось несколько конкурирующих форматов, призванных стандартизировать или расширить формат V7, чтобы преодолеть его ограничения. Наиболее распространены форматы USTAR, PAX и GNU, каждый со своими преимуществами и ограничениями.

В следующей таблице представлены возможности каждого формата:

                  |  USTAR |       PAX |       GNU
------------------+--------+-----------+----------
Name              |   256B | unlimited | unlimited
Linkname          |   100B | unlimited | unlimited
Size              | uint33 | unlimited |    uint89
Mode              | uint21 |    uint21 |    uint57
Uid/Gid           | uint21 | unlimited |    uint57
Uname/Gname       |    32B | unlimited |       32B
ModTime           | uint33 | unlimited |     int89
AccessTime        |    n/a | unlimited |     int89
ChangeTime        |    n/a | unlimited |     int89
Devmajor/Devminor | uint21 |    uint21 |    uint57
------------------+--------+-----------+----------
string encoding   |  ASCII |     UTF-8 |    binary
sub-second times  |     no |       yes |        no
sparse files      |     no |       yes |       yes

В верхней части таблицы показаны поля Header: для каждого строкового поля указан максимальный размер в байтах, а для каждого числового поля — целочисленный тип, используемый для его хранения (временные метки хранятся как число секунд, прошедших с начала эпохи Unix).

В нижней части таблицы показаны специализированные возможности каждого формата, например поддерживаемые кодировки строк, поддержка временных меток с точностью до долей секунды или поддержка разреженных файлов.

В настоящее время Writer не поддерживает разреженные файлы.

type Format int

Константы для идентификации различных форматов tar.

const (

    // FormatUnknown indicates that the format is unknown.
    FormatUnknown Format

    // FormatUSTAR represents the USTAR header format defined in POSIX.1-1988.
    //
    // While this format is compatible with most tar readers,
    // the format has several limitations making it unsuitable for some usages.
    // Most notably, it cannot support sparse files, files larger than 8GiB,
    // filenames larger than 256 characters, and non-ASCII filenames.
    //
    // Reference:
    //	http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06
    FormatUSTAR

    // FormatPAX represents the PAX header format defined in POSIX.1-2001.
    //
    // PAX extends USTAR by writing a special file with Typeflag TypeXHeader
    // preceding the original header. This file contains a set of key-value
    // records, which are used to overcome USTAR's shortcomings, in addition to
    // providing the ability to have sub-second resolution for timestamps.
    //
    // Some newer formats add their own extensions to PAX by defining their
    // own keys and assigning certain semantic meaning to the associated values.
    // For example, sparse file support in PAX is implemented using keys
    // defined by the GNU manual (e.g., "GNU.sparse.map").
    //
    // Reference:
    //	http://pubs.opengroup.org/onlinepubs/009695399/utilities/pax.html
    FormatPAX

    // FormatGNU represents the GNU header format.
    //
    // The GNU header format is older than the USTAR and PAX standards and
    // is not compatible with them. The GNU format supports
    // arbitrary file sizes, filenames of arbitrary encoding and length,
    // sparse files, and other features.
    //
    // It is recommended that PAX be chosen over GNU unless the target
    // application can only parse GNU formatted archives.
    //
    // Reference:
    //	https://www.gnu.org/software/tar/manual/html_node/Standard.html
    FormatGNU
)

func (Format) String 1.10

func (f Format) String() string

тип Header

Header представляет один заголовок в tar-архиве. Некоторые поля могут быть не заполнены.

Для обеспечения прямой совместимости пользователям, которые получают Header из Reader.Next, изменяют его и затем передают обратно в Writer.WriteHeader, следует создавать новый Header и копировать в него поля, которые необходимо сохранить.

type Header struct {
    // Typeflag is the type of header entry.
    // The zero value is automatically promoted to either TypeReg or TypeDir
    // depending on the presence of a trailing slash in Name.
    Typeflag byte

    Name     string // Name of file entry
    Linkname string // Target name of link (valid for TypeLink or TypeSymlink)

    Size  int64  // Logical file size in bytes
    Mode  int64  // Permission and mode bits
    Uid   int    // User ID of owner
    Gid   int    // Group ID of owner
    Uname string // User name of owner
    Gname string // Group name of owner

    // If the Format is unspecified, then Writer.WriteHeader rounds ModTime
    // to the nearest second and ignores the AccessTime and ChangeTime fields.
    //
    // To use AccessTime or ChangeTime, specify the Format as PAX or GNU.
    // To use sub-second resolution, specify the Format as PAX.
    ModTime    time.Time // Modification time
    AccessTime time.Time // Access time (requires either PAX or GNU support)
    ChangeTime time.Time // Change time (requires either PAX or GNU support)

    Devmajor int64 // Major device number (valid for TypeChar or TypeBlock)
    Devminor int64 // Minor device number (valid for TypeChar or TypeBlock)

    // Xattrs stores extended attributes as PAX records under the
    // "SCHILY.xattr." namespace.
    //
    // The following are semantically equivalent:
    //  h.Xattrs[key] = value
    //  h.PAXRecords["SCHILY.xattr."+key] = value
    //
    // When Writer.WriteHeader is called, the contents of Xattrs will take
    // precedence over those in PAXRecords.
    //
    // Deprecated: Use PAXRecords instead.
    Xattrs map[string]string // Go 1.3

    // PAXRecords is a map of PAX extended header records.
    //
    // User-defined records should have keys of the following form:
    //	VENDOR.keyword
    // Where VENDOR is some namespace in all uppercase, and keyword may
    // not contain the '=' character (e.g., "GOLANG.pkg.version").
    // The key and value should be non-empty UTF-8 strings.
    //
    // When Writer.WriteHeader is called, PAX records derived from the
    // other fields in Header take precedence over PAXRecords.
    PAXRecords map[string]string // Go 1.10

    // Format specifies the format of the tar header.
    //
    // This is set by Reader.Next as a best-effort guess at the format.
    // Since the Reader liberally reads some non-compliant files,
    // it is possible for this to be FormatUnknown.
    //
    // If the format is unspecified when Writer.WriteHeader is called,
    // then it uses the first format (in the order of USTAR, PAX, GNU)
    // capable of encoding this Header (see Format).
    Format Format // Go 1.10
}

func FileInfoHeader 1.1

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

FileInfoHeader создает частично заполненный Header на основе fi. Если fi описывает символическую ссылку, FileInfoHeader записывает link в качестве цели ссылки. Если fi описывает каталог, к имени добавляется косая черта.

Поскольку метод Name интерфейса fs.FileInfo возвращает только базовое имя описываемого файла, может потребоваться изменить Header.Name, чтобы указать полный путь к файлу.

Если fi реализует FileInfoNames, значения Header.Gname и Header.Uname предоставляются методами интерфейса.

func (*Header) FileInfo 1.1

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

FileInfo возвращает fs.FileInfo для Header.

тип Reader

Reader обеспечивает последовательный доступ к содержимому tar-архива. Reader.Next переходит к следующему файлу в архиве (включая первый), после чего Reader можно использовать как io.Reader для доступа к данным файла.

type Reader struct {
    // contains filtered or unexported fields
}

func NewReader

func NewReader(r io.Reader) *Reader

NewReader создает новый Reader, читающий данные из r.

func (*Reader) Next

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

Next переходит к следующей записи в tar-архиве. Header.Size определяет, сколько байтов можно прочитать для следующего файла. Любые оставшиеся данные текущего файла автоматически отбрасываются. В конце архива Next возвращает ошибку io.EOF.

Если Next встречает нелокальное имя файла (согласно определению filepath.IsLocal), а переменная среды GODEBUG содержит `tarinsecurepath=0`, проверяются только имена файлов, но не цели ссылок. Next возвращает заголовок с ошибкой ErrInsecurePath. В будущей версии Go такое поведение может быть включено по умолчанию. Программы, которым нужно принимать нелокальные имена, могут игнорировать ошибку ErrInsecurePath и использовать возвращенный заголовок.

func (*Reader) Read

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

Read читает данные текущего файла в tar-архиве. При достижении конца этого файла возвращается (0, io.EOF); это продолжается до вызова [Next] для перехода к следующему файлу.

Если текущий файл является разреженным, области, помеченные как пропуски, при чтении возвращаются как нулевые байты.

Вызов Read для специальных типов, таких как TypeLink, TypeSymlink, TypeChar, TypeBlock, TypeDir и TypeFifo, возвращает (0, io.EOF) независимо от значения, указанного в Header.Size.

тип Writer

Writer обеспечивает последовательную запись tar-архива. Writer.WriteHeader начинает новый файл с переданным Header, после чего Writer можно использовать как io.Writer для передачи данных этого файла.

type Writer struct {
    // contains filtered or unexported fields
}

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter создает новый Writer, записывающий данные в w.

func (*Writer) AddFS 1.22

func (tw *Writer) AddFS(fsys fs.FS) error

AddFS добавляет файлы из fs.FS в архив. Он обходит дерево каталогов, начиная с корня файловой системы, и добавляет каждый файл в tar-архив, сохраняя структуру каталогов.

func (*Writer) Close

func (tw *Writer) Close() error

Close закрывает tar-архив, сбрасывая заполняющие данные и записывая завершающую часть. Если текущий файл (из предшествующего вызова Writer.WriteHeader) записан не полностью, возвращается ошибка.

func (*Writer) Flush

func (tw *Writer) Flush() error

Flush завершает запись заполняющих данных блока текущего файла. Перед вызовом Flush текущий файл должен быть записан полностью.

Это необязательно, поскольку следующий вызов Writer.WriteHeader или Writer.Close автоматически запишет заполняющие данные файла.

func (*Writer) Write

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

Write записывает данные в текущий файл tar-архива. Write возвращает ошибку ErrWriteTooLong, если после вызова Writer.WriteHeader записано больше байтов, чем указано в Header.Size.

Вызов Write для специальных типов, таких как TypeLink, TypeSymlink, TypeChar, TypeBlock, TypeDir и TypeFifo, возвращает (0, ErrWriteTooLong) независимо от значения, указанного в Header.Size.

func (*Writer) WriteHeader

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

WriteHeader записывает hdr и подготавливает Writer к приему содержимого файла. Header.Size определяет, сколько байтов можно записать для следующего файла. Если текущий файл записан не полностью, возвращается ошибка. Перед записью заголовка этот метод автоматически сбрасывает все необходимые заполняющие данные.

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/archive/tar/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API