Метод tar.Writer.WriteHeader

Метод tar.Writer.WriteHeader записывает заголовок файла в TAR-архив. В первый параметр мы передаем указатель на структуру tar.Header, которая содержит метаданные файла: имя, размер, права доступа и другие атрибуты. После успешной записи заголовка, мы можем записать содержимое файла с помощью метода Write. Важно помнить, что заголовок должен быть записан перед содержимым каждого файла в архиве.

Синтаксис

goerr := writer.WriteHeader(header)

Пример

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

gopackage main

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

func main() {
  // Create a buffer to write our archive to.
  buf := new(bytes.Buffer)

  // Create a new tar writer.
  tw := tar.NewWriter(buf)

  // Create a header for the file.
  header := &tar.Header{
    Name: "example.txt",
    Mode: 0644,
    Size: 11,
  }

  // Write the header.
  err := tw.WriteHeader(header)
  if err != nil {
    fmt.Println("Error writing header:", err)
    return
  }

  // Write the file content.
  content := []byte("Hello World")
  _, err = tw.Write(content)
  if err != nil {
    fmt.Println("Error writing content:", err)
    return
  }

  // Close the tar writer.
  tw.Close()

  // Write the archive to a file.
  err = os.WriteFile("example.tar", buf.Bytes(), 0644)
  if err != nil {
    fmt.Println("Error writing file:", err)
    return
  }

  fmt.Println("TAR archive created successfully")
}

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

go"TAR archive created successfully"

Пример

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

gopackage main

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

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

  files := []struct {
    Name  string
    Content string
  }{
    {"dir1/file1.txt", "Content of file 1"},
    {"dir2/file2.txt", "Content of file 2"},
    {"file3.txt", "Content of file 3"},
  }

  for _, f := range files {
    header := &tar.Header{
      Name: f.Name,
      Mode: 0644,
      Size: int64(len(f.Content)),
    }

    err := tw.WriteHeader(header)
    if err != nil {
      fmt.Println("Error writing header:", err)
      return
    }

    _, err = tw.Write([]byte(f.Content))
    if err != nil {
      fmt.Println("Error writing content:", err)
      return
    }
  }

  tw.Close()

  err := os.WriteFile("multiple.tar", buf.Bytes(), 0644)
  if err != nil {
    fmt.Println("Error writing file:", err)
    return
  }

  fmt.Println("TAR archive with multiple files created")
}

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

go"TAR archive with multiple files created"

Пример

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

gopackage main

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

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

  now := time.Now()

  header := &tar.Header{
    Name:  "config.txt",
    Mode:  0600,
    Size:  12,
    ModTime: now,
    Uid:   1000,
    Gid:   1000,
  }

  err := tw.WriteHeader(header)
  if err != nil {
    fmt.Println("Error writing header:", err)
    return
  }

  content := []byte("config data")
  _, err = tw.Write(content)
  if err != nil {
    fmt.Println("Error writing content:", err)
    return
  }

  tw.Close()

  err = os.WriteFile("config.tar", buf.Bytes(), 0644)
  if err != nil {
    fmt.Println("Error writing file:", err)
    return
  }

  fmt.Println("TAR archive with metadata created")
}

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

go"TAR archive with metadata created"

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

  • пакет archive/tar,
    который предоставляет функциональность для работы с TAR-архивами
  • функцию tar.NewWriter,
    которая создает новый TAR-писатель
  • метод tar.Writer.Close,
    который закрывает TAR-писатель и завершает запись архива
  • структуру tar.Header,
    которая содержит метаданные файла в TAR-архиве