Функция zip.NewReader

Функция zip.NewReader создает новый zip.Reader, который позволяет читать содержимое ZIP архива из переданного байтового среза. В первый параметр функция принимает []byte с данными архива, во второй параметр - размер архива в байтах (тип int64). Функция возвращает указатель на zip.Reader и ошибку, если архив поврежден или имеет неверный формат.

Синтаксис

gozip.NewReader(data []byte, size int64) (*zip.Reader, error)

Пример

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

gopackage main

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

func main() {
  zipData := []byte{80, 75, 3, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 1, 2, 20, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  size := int64(len(zipData))

  r, err := zip.NewReader(zipData, size)
  if err != nil {
    log.Fatal(err)
  }

  for _, f := range r.File {
    fmt.Println(f.Name)
  }
}

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

go"file1.txt"
"file2.txt"

Пример

Давайте прочитаем ZIP архив и извлечем содержимое первого файла:

gopackage main

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

func main() {
  zipData := []byte{80, 75, 3, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 1, 2, 20, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  size := int64(len(zipData))

  r, err := zip.NewReader(zipData, size)
  if err != nil {
    log.Fatal(err)
  }

  firstFile := r.File[0]
  rc, err := firstFile.Open()
  if err != nil {
    log.Fatal(err)
  }
  defer rc.Close()

  content, err := io.ReadAll(rc)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("%s: %s", firstFile.Name, content)
}

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

go"file1.txt: Hello, World!"

Пример

Давайте обработаем ошибку при попытке чтения поврежденного ZIP архива:

gopackage main

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

func main() {
  invalidData := []byte{0, 1, 2, 3, 4, 5}
  size := int64(len(invalidData))

  r, err := zip.NewReader(invalidData, size)
  if err != nil {
    log.Printf("Error: %v", err)
    return
  }

  fmt.Printf("Files: %d", len(r.File))
}

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

go"Error: zip: not a valid zip file"

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

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