Метод zip.Writer.CreateHeader

Метод zip.Writer.CreateHeader создает новый файл внутри ZIP-архива с заданным заголовком. В отличие от метода Create, этот метод позволяет полностью контролировать метаданные файла, такие как время модификации, режим доступа, метод сжатия и другие параметры. В качестве единственного параметра метод принимает указатель на структуру zip.FileHeader, которая содержит всю информацию о файле. Метод возвращает объект io.Writer, в который можно записывать содержимое файла.

Синтаксис

gofunc (w *zip.Writer) CreateHeader(fh *zip.FileHeader) (io.Writer, error)

Пример

Давайте создадим ZIP-архив и добавим в него файл с настраиваемым заголовком, указав имя файла и время модификации:

gopackage main

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

func main() {
  file, err := os.Create("archive.zip")
  if err != nil {
    panic(err)
  }
  defer file.Close()

  zipWriter := zip.NewWriter(file)
  defer zipWriter.Close()

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

  writer, err := zipWriter.CreateHeader(header)
  if err != nil {
    panic(err)
  }

  writer.Write([]byte("Hello, World!"))
}

Пример

Давайте создадим ZIP-архив и добавим в него файл с указанием метода сжатия Deflate и установкой прав доступа только для чтения:

gopackage main

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

func main() {
  file, err := os.Create("secure.zip")
  if err != nil {
    panic(err)
  }
  defer file.Close()

  zipWriter := zip.NewWriter(file)
  defer zipWriter.Close()

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

  writer, err := zipWriter.CreateHeader(header)
  if err != nil {
    panic(err)
  }

  writer.Write([]byte("Secret data"))
}

Пример

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

gopackage main

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

func main() {
  file, err := os.Create("files.zip")
  if err != nil {
    panic(err)
  }
  defer file.Close()

  zipWriter := zip.NewWriter(file)
  defer zipWriter.Close()

  files := []struct {
    name  string
    content string
    mode  os.FileMode
  }{
    {"readme.txt", "Readme content", 0644},
    {"secret.log", "Log data", 0600},
    {"public.log", "Public log", 0644},
  }

  for _, f := range files {
    header := &zip.FileHeader{
      Name:   f.name,
      Method:   zip.Deflate,
      Modified: time.Now(),
    }
    header.SetMode(f.mode)

    writer, err := zipWriter.CreateHeader(header)
    if err != nil {
      panic(err)
    }

    writer.Write([]byte(f.content))
  }
}

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

  • метод zip.Writer.Create,
    который создает файл в ZIP-архиве с автоматическим заполнением заголовка
  • метод zip.Writer.Close,
    который завершает запись ZIP-архива и закрывает его
  • структуру zip.FileHeader,
    которая содержит метаданные файла в ZIP-архиве
  • функцию zip.NewWriter,
    которая создает новый объект для записи ZIP-архива