Тип zip.Writer
Тип zip.Writer предоставляет функциональность для создания ZIP-архивов.
Он используется в паре с io.Writer, в который будет записан готовый архив.
Основные методы типа: Create для добавления нового файла в архив,
CreateHeader для добавления файла с настраиваемыми метаданными и
Close для завершения записи архива. После создания экземпляра
zip.Writer необходимо вызвать метод Close для корректного
завершения формирования архива.
Создание экземпляра zip.Writer
Для создания нового zip.Writer используется функция zip.NewWriter,
которая принимает io.Writer и возвращает указатель на zip.Writer.
В качестве io.Writer обычно выступает файл, созданный с помощью
os.Create, либо буфер, например, bytes.Buffer.
package main
import (
"archive/zip"
"os"
)
func main() {
file, err := os.Create("archive.zip")
if err != nil {
panic(err)
}
defer file.Close()
zipWriter := zip.NewWriter(file)
defer zipWriter.Close()
}
Метод Create - добавление файла в архив
Метод Create добавляет новый файл в архив. Он принимает имя файла
внутри архива и возвращает io.Writer, в который нужно записать
содержимое файла. Если имя файла содержит путь с разделителями
(например, "dir/file.txt"), то внутри архива будут созданы соответствующие
директории.
package main
import (
"archive/zip"
"os"
)
func main() {
file, _ := os.Create("example.zip")
defer file.Close()
zipWriter := zip.NewWriter(file)
defer zipWriter.Close()
// Добавляем файл "hello.txt" в архив
w, _ := zipWriter.Create("hello.txt")
w.Write([]byte("Hello, World!"))
// Добавляем файл в поддиректорию
w, _ = zipWriter.Create("dir/greeting.txt")
w.Write([]byte("Welcome to Go!"))
}
Метод CreateHeader - добавление файла с настройками
Метод CreateHeader позволяет добавить файл в архив с настраиваемыми
метаданными. Он принимает структуру zip.FileHeader, в которой можно
задать имя файла, метод сжатия, права доступа, дату модификации и другие
параметры. Это дает больше контроля над добавляемыми файлами по сравнению
с методом Create.
package main
import (
"archive/zip"
"os"
"time"
)
func main() {
file, _ := os.Create("custom.zip")
defer file.Close()
zipWriter := zip.NewWriter(file)
defer zipWriter.Close()
// Создаем заголовок для файла
header := &zip.FileHeader{
Name: "data.txt",
Method: zip.Deflate, // метод сжатия
Modified: time.Now(),
}
// Добавляем файл с заголовком
w, _ := zipWriter.CreateHeader(header)
w.Write([]byte("Custom file content"))
}
Метод Close - завершение записи архива
Метод Close завершает формирование ZIP-архива. Он записывает
центральную директорию (оглавление архива) и закрывает внутренние
структуры. Всегда вызывайте Close после добавления всех файлов,
иначе архив будет поврежден. Обычно его вызывают через defer
сразу после создания zip.Writer.
package main
import (
"archive/zip"
"bytes"
"fmt"
)
func main() {
buf := new(bytes.Buffer)
zipWriter := zip.NewWriter(buf)
// Добавляем файлы в архив
w, _ := zipWriter.Create("file1.txt")
w.Write([]byte("Content 1"))
w, _ = zipWriter.Create("file2.txt")
w.Write([]byte("Content 2"))
// Закрываем архив и проверяем ошибку
err := zipWriter.Close()
if err != nil {
fmt.Println("Error closing archive:", err)
return
}
fmt.Printf("Archive size: %d bytes\n", buf.Len())
}
Пример работы с zip.Writer
В этом примере создается ZIP-архив с несколькими файлами разных типов: текстовый файл, файл с настраиваемыми правами доступа и вложенная директория. Архив сохраняется на диск.
package main
import (
"archive/zip"
"os"
)
func main() {
file, err := os.Create("full_example.zip")
if err != nil {
panic(err)
}
defer file.Close()
zipWriter := zip.NewWriter(file)
defer zipWriter.Close()
// Добавляем текстовый файл
w1, _ := zipWriter.Create("info.txt")
w1.Write([]byte("This is a text file"))
// Добавляем файл с настройками
header := &zip.FileHeader{
Name: "config.json",
Method: zip.Deflate,
}
w2, _ := zipWriter.CreateHeader(header)
w2.Write([]byte(`{"key": "value"}`))
// Добавляем файл в поддиректорию
w3, _ := zipWriter.Create("data/numbers.txt")
for i := 1; i <= 5; i++ {
w3.Write([]byte{byte('0' + i)})
}
}
Смотрите также
-
функцию
zip.NewWriter,
которая создает новый экземпляр zip.Writer -
метод
zip.Writer.Create,
который добавляет файл в ZIP-архив -
метод
zip.Writer.CreateHeader,
который добавляет файл с настраиваемыми метаданными -
метод
zip.Writer.Close,
который завершает запись ZIP-архива