Метод zip.Writer.Create
Метод zip.Writer.Create создает новый файл внутри ZIP-архива.
В качестве единственного параметра он принимает имя файла (строку),
которое будет использоваться в архиве. Метод возвращает интерфейс
io.Writer, в который можно записывать содержимое создаваемого
файла. После записи данных необходимо вызвать метод Close
у самого zip.Writer для завершения формирования архива.
Синтаксис
func (w *zip.Writer) Create(name string) (io.Writer, error)
Метод принимает имя файла и возвращает интерфейс для записи данных. В случае ошибки (например, если архив уже закрыт) возвращается ошибка.
Пример
Давайте создадим ZIP-архив и добавим в него один текстовый файл:
package 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())
}
Результат выполнения кода:
"Archive size: 152 bytes"
Пример
Создадим архив с несколькими файлами, используя имена с подкаталогами:
package 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))
}
Результат выполнения кода:
"Archive created with 3 files"
Пример
Обработаем ошибку, возникающую при попытке создать файл в уже закрытом архиве:
package 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)
}
}
Результат выполнения кода:
"Error: zip: writer closed"
Смотрите также
-
метод
zip.Writer.CreateHeader,
который создает файл с заданным заголовком -
метод
zip.Writer.Close,
который завершает запись архива и закрывает его -
функцию
zip.NewWriter,
которая создает новый экземплярzip.Writer -
функцию
zip.OpenReader,
которая открывает существующий ZIP-архив для чтения