Spec-Zone.ru › Go

Пакет tar

  • import "archive/tar"
  • Обзор
  • Индекс
  • Примеры

Обзор

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

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

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

Код:

// 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
  • Функция (f Format) String() string
  • Тип Header
  • Функция FileInfoHeader(fi fs.FileInfo, link string) (*Header, error)
  • Функция (h *Header) FileInfo() fs.FileInfo
  • Тип Reader
  • Функция NewReader(r io.Reader) *Reader
  • Функция (tr *Reader) Next() (*Header, error)
  • Функция (tr *Reader) Read(b []byte) (int, error)
  • Тип Writer
  • Функция NewWriter(w io.Writer) *Writer
  • Функция (tw *Writer) AddFS(fsys fs.FS) error
  • Функция (tw *Writer) Close() error
  • Функция (tw *Writer) Flush() error
  • Функция (tw *Writer) Write(b []byte) (int, error)
  • Функция (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
)

Функция (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
}

Функция 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 предоставляются методами интерфейса.

Функция (*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
}

Функция NewReader

func NewReader(r io.Reader) *Reader

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

Функция (*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 и использовать возвращённый заголовок.

Функция (*Reader) Read

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

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

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

Вызов 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
}

Функция NewWriter

func NewWriter(w io.Writer) *Writer

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

Функция (*Writer) AddFS 1.22

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

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

Функция (*Writer) Close

func (tw *Writer) Close() error

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

Функция (*Writer) Flush

func (tw *Writer) Flush() error

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

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

Функция (*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].

Функция (*Writer) WriteHeader

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

WriteHeader записывает hdr и подготавливает приём содержимого файла. 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