Функция zip.NewReader
Функция zip.NewReader создает новый zip.Reader,
который позволяет читать содержимое ZIP архива из переданного
байтового среза. В первый параметр функция принимает
[]byte с данными архива, во второй параметр -
размер архива в байтах (тип int64). Функция возвращает
указатель на zip.Reader и ошибку, если архив поврежден
или имеет неверный формат.
Синтаксис
zip.NewReader(data []byte, size int64) (*zip.Reader, error)
Пример
Давайте прочитаем ZIP архив из байтового среза и выведем имена всех файлов:
package 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)
}
}
Результат выполнения кода:
"file1.txt"
"file2.txt"
Пример
Давайте прочитаем ZIP архив и извлечем содержимое первого файла:
package 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)
}
Результат выполнения кода:
"file1.txt: Hello, World!"
Пример
Давайте обработаем ошибку при попытке чтения поврежденного ZIP архива:
package 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))
}
Результат выполнения кода:
"Error: zip: not a valid zip file"
Смотрите также
-
функцию
zip.OpenReader,
которая открывает ZIP архив из файла для чтения -
тип
zip.Reader,
который используется для чтения содержимого ZIP архива -
тип
zip.File,
который представляет отдельный файл внутри ZIP архива -
функцию
zip.NewWriter,
которая создает новыйzip.Writerдля записи ZIP архива