Тип tar.Header

Тип tar.Header представляет собой структуру, хранящую метаданные заголовка файла в tar-архиве. Он используется при записи файлов в архив с помощью tar.Writer и при чтении файлов из архива с помощью tar.Reader. Структура содержит поля для имени файла, его размера, прав доступа, времени модификации, типа файла и других атрибутов.

Синтаксис

gotype Header struct {
  Name     string
  Mode     int64
  Uid    int
  Gid    int
  Size     int64
  ModTime  time.Time
  Typeflag   byte
  Linkname   string
  Uname    string
  Gname    string
  Devmajor   int64
  Devminor   int64
  AccessTime time.Time
  ChangeTime time.Time
  Xattrs   map[string]string
}

Пример

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

gopackage main

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

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

  header := &tar.Header{
    Name:  "example.txt",
    Mode:  0644,
    Size:  11,
    ModTime: time.Now(),
    Uid:   os.Getuid(),
    Gid:   os.Getgid(),
  }

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

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

  tw.Close()

  fmt.Println("Archive created successfully")
}

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

go"Archive created successfully"

Пример

Прочитаем заголовки файлов из существующего tar-архива:

gopackage main

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

func main() {
  file, err := os.Open("example.tar")
  if err != nil {
    fmt.Println("Error opening archive:", err)
    return
  }
  defer file.Close()

  tr := tar.NewReader(file)

  for {
    header, err := tr.Next()
    if err == io.EOF {
      break
    }
    if err != nil {
      fmt.Println("Error reading header:", err)
      return
    }

    fmt.Printf("Name: %s, Size: %d, Mode: %04o\n",
      header.Name, header.Size, header.Mode)
  }
}

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

go"Name: example.txt, Size: 11, Mode: 0644"
"Name: another.txt, Size: 20, Mode: 0644"

Пример

Создадим заголовок для директории с установкой прав доступа:

gopackage main

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

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

  header := &tar.Header{
    Name:   "mydir/",
    Mode:   0755,
    Typeflag: tar.TypeDir,
    ModTime:  time.Now(),
    Uid:    1000,
    Gid:    1000,
    Uname:  "user",
    Gname:  "group",
  }

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

  tw.Close()

  fmt.Println("Directory header created successfully")
}

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

go"Directory header created successfully"

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

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