Тип tar.Writer

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

Синтаксис

gotype Writer struct {
  // содержит скрытые поля
}

func NewWriter(w io.Writer) *Writer
func (tw *Writer) WriteHeader(hdr *Header) error
func (tw *Writer) Write(b []byte) (int, error)
func (tw *Writer) Close() error

Пример

Создадим tar-архив и запишем в него один файл:

gopackage main

import (
  "archive/tar"
  "bytes"
  "fmt"
  "log"
)

func main() {
  // Создаем буфер для хранения архива
  buf := new(bytes.Buffer)

  // Создаем новый tar.Writer
  tw := tar.NewWriter(buf)

  // Создаем заголовок для файла
  hdr := &tar.Header{
    Name: "file.txt",
    Mode: 0600,
    Size: int64(len("Hello, World!")),
  }

  // Записываем заголовок
  err := tw.WriteHeader(hdr)
  if err != nil {
    log.Fatal(err)
  }

  // Записываем содержимое файла
  _, err = tw.Write([]byte("Hello, World!"))
  if err != nil {
    log.Fatal(err)
  }

  // Закрываем архив
  err = tw.Close()
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println("Archive size:", buf.Len())
}

Результат выполнения кода:

go"Archive size: 512"

Пример

Запишем несколько файлов в один tar-архив:

gopackage main

import (
  "archive/tar"
  "bytes"
  "fmt"
  "log"
)

func main() {
  buf := new(bytes.Buffer)
  tw := tar.NewWriter(buf)

  // Создаем первый файл
  hdr1 := &tar.Header{
    Name: "file1.txt",
    Mode: 0644,
    Size: int64(len("Content 1")),
  }
  err := tw.WriteHeader(hdr1)
  if err != nil {
    log.Fatal(err)
  }
  _, err = tw.Write([]byte("Content 1"))
  if err != nil {
    log.Fatal(err)
  }

  // Создаем второй файл
  hdr2 := &tar.Header{
    Name: "file2.txt",
    Mode: 0644,
    Size: int64(len("Content 2")),
  }
  err = tw.WriteHeader(hdr2)
  if err != nil {
    log.Fatal(err)
  }
  _, err = tw.Write([]byte("Content 2"))
  if err != nil {
    log.Fatal(err)
  }

  err = tw.Close()
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println("Archive contains 2 files, size:", buf.Len())
}

Результат выполнения кода:

go"Archive contains 2 files, size: 1024"

Пример

Запишем файл с директорией и вложенным файлом:

gopackage main

import (
  "archive/tar"
  "bytes"
  "fmt"
  "log"
)

func main() {
  buf := new(bytes.Buffer)
  tw := tar.NewWriter(buf)

  // Создаем директорию
  dirHdr := &tar.Header{
    Name:   "dir/",
    Mode:   0755,
    Typeflag: tar.TypeDir,
  }
  err := tw.WriteHeader(dirHdr)
  if err != nil {
    log.Fatal(err)
  }

  // Создаем файл внутри директории
  fileHdr := &tar.Header{
    Name: "dir/file.txt",
    Mode: 0644,
    Size: int64(len("Nested file content")),
  }
  err = tw.WriteHeader(fileHdr)
  if err != nil {
    log.Fatal(err)
  }
  _, err = tw.Write([]byte("Nested file content"))
  if err != nil {
    log.Fatal(err)
  }

  err = tw.Close()
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println("Archive with directory and nested file, size:", buf.Len())
}

Результат выполнения кода:

go"Archive with directory and nested file, size: 1024"

Смотрите также

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