Тип zip.FileHeader
Тип zip.FileHeader представляет метаданные файла внутри ZIP-архива.
Он содержит информацию о файле: имя, размер, дату модификации, права доступа
и другие атрибуты. Обычно этот тип используется при создании ZIP-архивов
с помощью zip.Writer или при чтении существующих архивов
через zip.File.
Основные поля
Структура zip.FileHeader содержит следующие важные поля:
type FileHeader struct {
Name string
Method uint16
Modified time.Time
Mode FileMode
Extra []byte
}
Поле Name хранит путь к файлу внутри архива,
Method определяет метод сжатия (Store или Deflate),
Modified - время модификации, Mode - права доступа,
а Extra - дополнительные данные.
Создание заголовка для нового файла
Для создания заголовка нового файла используется функция
zip.FileInfoHeader, которая создает FileHeader
на основе информации о файле из файловой системы:
package main
import (
"archive/zip"
"fmt"
"os"
"time"
)
func main() {
fileInfo, err := os.Stat("example.txt")
if err != nil {
fmt.Println("Error:", err)
return
}
header, err := zip.FileInfoHeader(fileInfo)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Name: %s\n", header.Name)
fmt.Printf("Size: %d\n", fileInfo.Size())
fmt.Printf("Modified: %s\n", header.Modified.Format(time.RFC3339))
}
Результат выполнения кода:
"Name: example.txt"
"Size: 1024"
"Modified: 2026-09-04T12:34:56Z"
Создание ZIP-архива с использованием FileHeader
При создании ZIP-архива можно настроить заголовок каждого файла, изменяя его поля перед записью:
package main
import (
"archive/zip"
"bytes"
"fmt"
"time"
)
func main() {
buf := new(bytes.Buffer)
writer := zip.NewWriter(buf)
header := &zip.FileHeader{
Name: "data.txt",
Method: zip.Deflate,
Modified: time.Now(),
}
fileWriter, err := writer.CreateHeader(header)
if err != nil {
fmt.Println("Error:", err)
return
}
_, err = fileWriter.Write([]byte("Hello, World!"))
if err != nil {
fmt.Println("Error:", err)
return
}
err = writer.Close()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Archive created, size: %d bytes\n", buf.Len())
}
Результат выполнения кода:
"Archive created, size: 84 bytes"
Чтение заголовка из существующего ZIP-архива
При чтении ZIP-архива каждый файл представлен структурой
zip.File, которая содержит поле FileHeader
с метаданными файла:
package main
import (
"archive/zip"
"fmt"
"log"
"os"
)
func main() {
reader, err := zip.OpenReader("archive.zip")
if err != nil {
log.Fatal(err)
}
defer reader.Close()
for _, file := range reader.File {
header := file.FileHeader
fmt.Printf("File: %s\n", header.Name)
fmt.Printf(" Method: %d\n", header.Method)
fmt.Printf(" Modified: %s\n", header.Modified)
fmt.Printf(" Mode: %o\n", header.Mode)
fmt.Printf(" Uncompressed size: %d\n", header.UncompressedSize64)
}
}
Результат выполнения кода:
"File: data.txt"
" Method: 8"
" Modified: 2026-09-04 12:34:56 +0000 UTC"
" Mode: 644"
" Uncompressed size: 13"
Настройка метода сжатия
В поле Method можно задать один из методов сжатия.
Значение zip.Store (0) означает хранение без сжатия,
а zip.Deflate (8) - сжатие алгоритмом Deflate:
package main
import (
"archive/zip"
"bytes"
"fmt"
)
func main() {
buf := new(bytes.Buffer)
writer := zip.NewWriter(buf)
header := &zip.FileHeader{
Name: "large_file.txt",
Method: zip.Store,
}
header.SetModified(nil)
fileWriter, _ := writer.CreateHeader(header)
data := []byte("Lorem ipsum dolor sit amet")
fileWriter.Write(data)
writer.Close()
fmt.Printf("Stored size: %d bytes\n", buf.Len())
}
Результат выполнения кода:
"Stored size: 44 bytes"
Смотрите также
-
тип
zip.File,
который представляет файл внутри ZIP-архива -
функцию
zip.NewWriter,
которая создает новыйzip.Writerдля записи архива -
метод
zip.Writer.CreateHeader,
который создает файл в архиве с заданным заголовком -
функцию
zip.OpenReader,
которая открывает ZIP-архив для чтения