Тип zip.FileHeader

Тип zip.FileHeader представляет метаданные файла внутри ZIP-архива. Он содержит информацию о файле: имя, размер, дату модификации, права доступа и другие атрибуты. Обычно этот тип используется при создании ZIP-архивов с помощью zip.Writer или при чтении существующих архивов через zip.File.

Основные поля

Структура zip.FileHeader содержит следующие важные поля:

gotype FileHeader struct {
  Name   string
  Method   uint16
  Modified time.Time
  Mode   FileMode
  Extra  []byte
}

Поле Name хранит путь к файлу внутри архива, Method определяет метод сжатия (Store или Deflate), Modified - время модификации, Mode - права доступа, а Extra - дополнительные данные.

Создание заголовка для нового файла

Для создания заголовка нового файла используется функция zip.FileInfoHeader, которая создает FileHeader на основе информации о файле из файловой системы:

gopackage main

import (
  "archive/zip"
  "fmt"
  "os"
  "time"
)

func main() {
  fileInfo, err := os.Stat("example.txt")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  header, err := zip.FileInfoHeader(fileInfo)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Name: %s\n", header.Name)
  fmt.Printf("Size: %d\n", fileInfo.Size())
  fmt.Printf("Modified: %s\n", header.Modified.Format(time.RFC3339))
}

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

go"Name: example.txt"
"Size: 1024"
"Modified: 2026-09-04T12:34:56Z"

Создание ZIP-архива с использованием FileHeader

При создании ZIP-архива можно настроить заголовок каждого файла, изменяя его поля перед записью:

gopackage main

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

func main() {
  buf := new(bytes.Buffer)
  writer := zip.NewWriter(buf)

  header := &zip.FileHeader{
    Name:   "data.txt",
    Method:   zip.Deflate,
    Modified: time.Now(),
  }

  fileWriter, err := writer.CreateHeader(header)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  _, err = fileWriter.Write([]byte("Hello, World!"))
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  err = writer.Close()
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

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

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

go"Archive created, size: 84 bytes"

Чтение заголовка из существующего ZIP-архива

При чтении ZIP-архива каждый файл представлен структурой zip.File, которая содержит поле FileHeader с метаданными файла:

gopackage main

import (
  "archive/zip"
  "fmt"
  "log"
  "os"
)

func main() {
  reader, err := zip.OpenReader("archive.zip")
  if err != nil {
    log.Fatal(err)
  }
  defer reader.Close()

  for _, file := range reader.File {
    header := file.FileHeader
    fmt.Printf("File: %s\n", header.Name)
    fmt.Printf("  Method: %d\n", header.Method)
    fmt.Printf("  Modified: %s\n", header.Modified)
    fmt.Printf("  Mode: %o\n", header.Mode)
    fmt.Printf("  Uncompressed size: %d\n", header.UncompressedSize64)
  }
}

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

go"File: data.txt"
"  Method: 8"
"  Modified: 2026-09-04 12:34:56 +0000 UTC"
"  Mode: 644"
"  Uncompressed size: 13"

Настройка метода сжатия

В поле Method можно задать один из методов сжатия. Значение zip.Store (0) означает хранение без сжатия, а zip.Deflate (8) - сжатие алгоритмом Deflate:

gopackage main

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

func main() {
  buf := new(bytes.Buffer)
  writer := zip.NewWriter(buf)

  header := &zip.FileHeader{
    Name:   "large_file.txt",
    Method: zip.Store,
  }
  header.SetModified(nil)

  fileWriter, _ := writer.CreateHeader(header)
  data := []byte("Lorem ipsum dolor sit amet")
  fileWriter.Write(data)

  writer.Close()

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

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

go"Stored size: 44 bytes"

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

  • тип zip.File,
    который представляет файл внутри ZIP-архива
  • функцию zip.NewWriter,
    которая создает новый zip.Writer для записи архива
  • метод zip.Writer.CreateHeader,
    который создает файл в архиве с заданным заголовком
  • функцию zip.OpenReader,
    которая открывает ZIP-архив для чтения