Работа с архивами в Go

31
технологии 21.webp

Последнее обновление 11.03.2023 — Василий Иванов

Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

Архивы объединяют несколько файлов в единый формат, обычно это zip, tar или rar. Архивные файлы также могут использовать сжатие для уменьшения общего размера файла.

Вы можете использовать архивы для распространения программного обеспечения и данных, включая веб-страницы. Вы также можете заархивировать свое приложение со всеми его файлами и зависимостями, чтобы пользователи могли загрузить и установить его.

Архивный пакет Go позволяет создавать и распаковывать архивы в форматах tar и zip.

Архивный пакет Go

Go предоставляет архивные пакеты для работы с различными форматами архивов. Вы можете использовать пакеты zip и tar для создания, чтения и записи архивных файлов в этих форматах. Оба пакета поддерживают различные алгоритмы сжатия через простой в использовании API.

По теме:  Почему вы не должны игнорировать новые предупреждения Windows 8.1

Вот как вы можете импортировать пакеты zip и tar в свои файлы Go:

 import (
    "archive/zip"
    "archive/tar"
)

После импорта пакетов вы можете использовать их для создания архивных файлов и управления ими.

Создание и добавление файлов в архивы Tar

Пакет tar работает с архивами tar форматов tar и tar.gz, включая поддержку чтения и записи файлов с расширенными заголовками PAX.

Пакет tar предоставляет функцию NewWriter для создания новых tar-архивов. NewWriter принимает экземпляр интерфейса io.Writer, который может быть файлом или буфером памяти, и возвращает указатель на структуру tar.Writer.

 package main

import (
    "archive/tar"
    "os"
)

func main() {
    // Create a new file
    file, _ := os.Create("myarchive.tar")
    defer file.Close()

    // Create a new tar archive
    tarWriter := tar.NewWriter(file)
    defer tarWriter.Close()
}

Функция Create пакета os создает новый файл tar. Функция tar.NewWriter принимает файл и создает новый архив.

Вы можете добавлять файлы в tar-архив с помощью функций WriteHeader и Write. Функция WriteHeader принимает в качестве аргумента структуру tar.Header. Он содержит метаданные файла, такие как имя файла, размер и биты разрешений. Функция Write записывает содержимое файла в архив.

 import (
    "archive/tar"
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
   // Create a new file
   file, _ := os.Create("myarchive.tar")
   file, _ = os.Create("message.txt")
   defer file.Close()

   // Create a new tar archive
   tarWriter := tar.NewWriter(file)
   defer tarWriter.Close()

   // Add a file to the archive
   fileToAdd, _ := os.Open("file1.txt")
   defer fileToAdd.Close()
   fileInfo, _ := fileToAdd.Stat()
   header, _ := tar.FileInfoHeader(fileInfo, "")
   tarWriter.WriteHeader(header)
   _, _ = io.Copy(tarWriter, fileToAdd)
   fmt.Println("TAR archive operation completed")
}

Программа создает новые tar- и текстовые файлы с помощью функции Create пакета os и новый tar-архив с помощью NewWriter перед добавлением файла в архив.

Функция Open открывает файл для добавления в архив. Обратите внимание, что для успешного запуска этой программы вам понадобится файл с именем file1.txt в вашем рабочем каталоге.

Вы можете использовать функцию Stat экземпляра файла, чтобы получить метаданные, которые вам понадобятся для заголовка tar. Передайте его результат в FileInfoHeader, а затем передайте этот результат в функцию WriteHeader для настройки tar-файла. Наконец, скопируйте файл в архив с помощью io.Copy.

Извлечение файлов из архивов Tar

Вы можете использовать функцию NewReader для чтения содержимого файла архива tar. Функция NewReader принимает интерфейс io.Reader, который может быть файлом или буфером памяти. Он возвращает указатель на структуру tar.Reader.

 import (
    "archive/tar"
    "io"
    "os"
)

func main() {
    // Open the tar archive
    file, _ := os.Open("myarchive.tar")
    defer file.Close()

    // Create a new tar reader
    tarReader := tar.NewReader(file)

    // Iterate over the files in the archive
    for {
        header, err := tarReader.Next()

        if err == io.EOF {
            break
        }

        // Extract the file
        outFile, _ := os.Create(header.Name)
        defer outFile.Close()
        _, _ = io.Copy(outFile, tarReader)
    }
}

Бесконечный цикл for проходит через экземпляр tar-ридера и извлекает файлы, копируя каждый файл с помощью функции копирования пакета io.

Создание и добавление файлов в Zip-архивы

Вы можете создать новый zip-архив с помощью функции NewWriter zip-пакета. Функция NewWriter принимает экземпляр файла и возвращает средство записи zip.

 import (
    "archive/zip"
    "os"
)

func main() {
    // Create a new file
    file, err := os.Create("archive.zip")

    if err != nil {
        panic(err)
    }

    defer file.Close()

    // Create a new zip writer
    zipWriter := zip.NewWriter(file)
    defer zipWriter.Close()
}

В переменной zipWriter хранится новый экземпляр Writer, который возвращает NewWriter.

Вы можете добавлять файлы в свои zip-архивы с помощью функции Create экземпляра Writer. Функция Create принимает имя файла. Вы также можете использовать функцию записи экземпляра zip-файла для записи данных в файлы в zip-архивах.

 import (
    "archive/zip"
    "os"
)

func main() {
    // Create new files
    file, err := os.Create("archive.zip")
    file, err = os.Create("file1.txt")
    file, err = os.Create("file2.txt")

    if err != nil {
        panic(err)
    }

    defer file.Close()

    // Create a new zip writer
    zipWriter := zip.NewWriter(file)
    defer zipWriter.Close()

    // Add files to the archive
    file1, err := zipWriter.Create("file1.txt")

    if err != nil {
        panic(err)
    }

    file2, err := zipWriter.Create("file2.txt")

    if err != nil {
        panic(err)
    }

    // Write data to the files in the archive
    file1.Write([]byte("Hello, World!"))
    file2.Write([]byte("Goodbye, World!"))
    fmt.Println("zip archiving operation completed")
}

Основная функция начинается с использования Create для создания нового zip-файла и двух текстовых файлов. Затем он создает два модуля записи для добавления двух текстовых файлов в архив. Функция записи каждого экземпляра файла записывает сообщения в каждый из файлов в архиве.

Извлечение файлов из Zip-архивов

Вы можете извлечь существующий zip-файл, прочитав его с помощью функции OpenReader, затем просмотрев его содержимое и скопировав файлы с помощью пакета io.

 import (
    "archive/zip"
    "fmt"
    "io"
    "os"
)

func main() {
    // Open the archive
    zipReader, err := zip.OpenReader("archive.zip")

    if err != nil {
        panic(err)
    }

    defer zipReader.Close()

    // Extract files from the archive
    for _, file := range zipReader.File {
        zippedFile, err := file.Open()

        if err != nil {
            panic(err)
        }

        defer zippedFile.Close()

        // Create a new file with the same name as the zipped file
        extractedFile, err := os.Create(file.Name)

        if err != nil {
            panic(err)
        }

        defer extractedFile.Close()

        // Copy the data from the zipped file to the new file
        _, err = io.Copy(extractedFile, zippedFile)

        if err != nil {
            panic(err)
        }

        fmt.Printf("Extracted %s\n", file.Name)
    }
}

Функция OpenReader читает zip-архивы. Функция OpenReader принимает имя zip-файла в качестве аргумента и возвращает экземпляр программы чтения zip-файлов. Цикл for-range проходит через содержимое файлов в экземпляре средства чтения. Он создает новый файл с тем же именем, что и исходный файл, и копирует содержимое извлеченного файла в новый файл с помощью функции io.Copy.

Распаковать вручную или программно — решать вам

Распаковывать файлы программно удобно, если у вас есть много файлов или архивов для распаковки. Вы также можете интегрировать функции архивирования в свое основное приложение.

В других случаях вам может быть лучше использовать существующие приложения. Вы можете использовать встроенные или сторонние приложения для распаковки архивов в Windows, macOS и Linux.