Функция tar.NewWriter

Функция tar.NewWriter создает новый Writer, который используется для записи TAR-архивов. В качестве аргумента функция принимает интерфейс io.Writer - например, файл или буфер, в который будет записан архив. Возвращает функция указатель на tar.Writer, через который можно последовательно добавлять файлы в архив.

Синтаксис

gotar.NewWriter(w io.Writer) *tar.Writer

Пример

Давайте создадим TAR-архив и запишем в него один файл:

gopackage main

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

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

  // Создаем tar.Writer
  tw := tar.NewWriter(buf)
  defer tw.Close()

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

  // Записываем заголовок
  if err := tw.WriteHeader(hdr); err != nil {
    fmt.Println("Error writing header:", err)
    return
  }

  // Записываем содержимое файла
  if _, err := tw.Write([]byte("Hello, TAR!")); err != nil {
    fmt.Println("Error writing content:", err)
    return
  }

  // Закрываем writer
  tw.Close()

  fmt.Printf("Archive size: %d bytes\n", buf.Len())
}

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

go"Archive size: 512 bytes"

Пример

Давайте создадим TAR-архив с несколькими файлами:

gopackage main

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

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

  // Файл 1
  hdr1 := &tar.Header{
    Name: "file1.txt",
    Mode: 0644,
    Size: int64(len("Content 1")),
  }
  tw.WriteHeader(hdr1)
  tw.Write([]byte("Content 1"))

  // Файл 2
  hdr2 := &tar.Header{
    Name: "file2.txt",
    Mode: 0644,
    Size: int64(len("Content 2")),
  }
  tw.WriteHeader(hdr2)
  tw.Write([]byte("Content 2"))

  tw.Close()
  fmt.Printf("Archive contains 2 files, size: %d bytes\n", buf.Len())
}

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

go"Archive contains 2 files, size: 1024 bytes"

Пример

Давайте создадим TAR-архив и запишем его непосредственно в файл:

gopackage main

import (
  "archive/tar"
  "fmt"
  "os"
)

func main() {
  // Создаем файл для архива
  f, err := os.Create("archive.tar")
  if err != nil {
    fmt.Println("Error creating file:", err)
    return
  }
  defer f.Close()

  // Создаем tar.Writer с файлом в качестве io.Writer
  tw := tar.NewWriter(f)
  defer tw.Close()

  // Добавляем файл в архив
  hdr := &tar.Header{
    Name: "readme.txt",
    Mode: 0644,
    Size: int64(len("This is a README file")),
  }
  
  if err := tw.WriteHeader(hdr); err != nil {
    fmt.Println("Error writing header:", err)
    return
  }
  
  if _, err := tw.Write([]byte("This is a README file")); err != nil {
    fmt.Println("Error writing content:", err)
    return
  }

  fmt.Println("Archive created successfully")
}

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

go"Archive created successfully"

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

  • функцию tar.NewReader,
    которая создает Reader для чтения TAR-архивов
  • функцию tar.Writer.WriteHeader,
    которая записывает заголовок файла в архив
  • функцию tar.Writer.Close,
    которая закрывает Writer и завершает запись архива
  • функцию archive/zip,
    которая предоставляет аналогичный функционал для ZIP-архивов