Метод zip.File.Open

Метод zip.File.Open открывает файл, представленный структурой zip.File, для чтения. Он возвращает интерфейс io.ReadCloser, который позволяет читать содержимое файла из архива. После завершения работы с файлом необходимо вызвать метод Close для освобождения ресурсов. Метод не принимает никаких параметров и работает только с уже открытым архивом, полученным через zip.OpenReader или zip.NewReader.

Синтаксис

gofile.Open() (io.ReadCloser, error)

Пример

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

gopackage main

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

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

  for _, f := range r.File {
    rc, err := f.Open()
    if err != nil {
      log.Fatal(err)
    }
    defer rc.Close()

    data, err := io.ReadAll(rc)
    if err != nil {
      log.Fatal(err)
    }
    fmt.Printf("%s: %s\n", f.Name, data)
    break
  }
}

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

go"file.txt: Hello, World!"

Пример

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

gopackage main

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

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

  target := "data.txt"
  var found bool

  for _, f := range r.File {
    if f.Name == target {
      found = true
      rc, err := f.Open()
      if err != nil {
        log.Fatal(err)
      }
      defer rc.Close()

      data, err := io.ReadAll(rc)
      if err != nil {
        log.Fatal(err)
      }
      fmt.Printf("Content of %s: %s\n", target, data)
      break
    }
  }

  if !found {
    fmt.Printf("File %s not found in archive\n", target)
  }
}

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

go"Content of data.txt: This is the content of data.txt file"

Пример

Давайте обработаем ошибку при попытке открыть файл из архива:

gopackage main

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

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

  for _, f := range r.File {
    rc, err := f.Open()
    if err != nil {
      fmt.Printf("Failed to open %s: %v\n", f.Name, err)
      continue
    }
    fmt.Printf("Successfully opened %s\n", f.Name)
    rc.Close()
  }
}

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

go"Successfully opened file1.txt"
"Successfully opened file2.txt"

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

  • функцию zip.OpenReader,
    которая открывает zip-архив для чтения
  • функцию zip.NewReader,
    которая создает новый Reader из io.ReaderAt
  • структуру zip.File,
    которая представляет файл внутри архива
  • структуру zip.FileHeader,
    которая содержит метаданные файла в архиве