Метод zip.Writer.Create

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

Синтаксис

gofunc (w *zip.Writer) Create(name string) (io.Writer, error)

Метод принимает имя файла и возвращает интерфейс для записи данных. В случае ошибки (например, если архив уже закрыт) возвращается ошибка.

Пример

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

gopackage main

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

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

  fileWriter, err := zipWriter.Create("file.txt")
  if err != nil {
    fmt.Println("Error creating file:", err)
    return
  }

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

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

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

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

go"Archive size: 152 bytes"

Пример

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

gopackage main

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

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

  files := []struct {
    name string
    data []byte
  }{
    {"dir1/file1.txt", []byte("Content of file 1")},
    {"dir1/file2.txt", []byte("Content of file 2")},
    {"file3.txt", []byte("Content of file 3")},
  }

  for _, f := range files {
    fileWriter, err := zipWriter.Create(f.name)
    if err != nil {
      fmt.Println("Error creating file:", err)
      return
    }
    _, err = fileWriter.Write(f.data)
    if err != nil {
      fmt.Println("Error writing to file:", err)
      return
    }
  }

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

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

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

go"Archive created with 3 files"

Пример

Обработаем ошибку, возникающую при попытке создать файл в уже закрытом архиве:

gopackage main

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

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

  // Закрываем архив до создания файла
  err := zipWriter.Close()
  if err != nil {
    fmt.Println("Error closing archive:", err)
    return
  }

  _, err = zipWriter.Create("file.txt")
  if err != nil {
    fmt.Println("Error:", err)
  }
}

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

go"Error: zip: writer closed"

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

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