Метод zip.Writer.Close

Метод zip.Writer.Close завершает процесс создания ZIP-архива. Он записывает центральный директорий (центральную структуру каталога), которая содержит информацию о всех файлах в архиве, и закрывает базовый писатель. Вызов этого метода обязателен для получения корректного ZIP-файла, так как без него архив будет неполным и не сможет быть открыт стандартными архиваторами. Метод возвращает ошибку, если при записи директория произошла какая-либо проблема.

Синтаксис

gofunc (w *zip.Writer) Close() error

Пример

Давайте создадим простой ZIP-архив с одним текстовым файлом и закроем его с помощью zip.Writer.Close:

gopackage main

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

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

  zipWriter := zip.NewWriter(buf)

  fileWriter, err := zipWriter.Create("file.txt")
  if err != nil {
    log.Fatal(err)
  }

  _, err = fileWriter.Write([]byte("Hello, World!"))
  if err != nil {
    log.Fatal(err)
  }

  err = zipWriter.Close()
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("ZIP archive size: %d bytes", buf.Len())
}

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

go"ZIP archive size: 86 bytes"

Пример

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

gopackage main

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

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

  zipWriter := zip.NewWriter(buf)

  files := []struct {
    name  string
    content string
  }{
    {"file1.txt", "First file content"},
    {"file2.txt", "Second file content"},
    {"folder/file3.txt", "Third file content"},
  }

  for _, f := range files {
    w, err := zipWriter.Create(f.name)
    if err != nil {
      log.Fatal(err)
    }
    _, err = w.Write([]byte(f.content))
    if err != nil {
      log.Fatal(err)
    }
  }

  err := zipWriter.Close()
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Archive contains %d files", len(files))
}

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

go"Archive contains 3 files"

Пример

Давайте рассмотрим случай, когда нужно закрыть архив с обработкой ошибки, которая может возникнуть при записи центрального директория:

gopackage main

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

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

  zipWriter := zip.NewWriter(buf)

  w, err := zipWriter.Create("example.txt")
  if err != nil {
    log.Fatal(err)
  }

  _, err = w.Write([]byte("Some data"))
  if err != nil {
    log.Fatal(err)
  }

  if err := zipWriter.Close(); err != nil {
    log.Printf("Failed to close archive: %v", err)
  } else {
    fmt.Println("Archive closed successfully")
  }
}

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

go"Archive closed successfully"

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

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