РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1339 of 1593 menu

Тип 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-архив для чтения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить