Cómo comprimir y descomprimir archivos en Golang

Cómo comprimir y descomprimir archivos en Golang

Los algoritmos Gzip y Zlib se usan popularmente para comprimir y descomprimir archivos. Gzip se usa principalmente para comprimir archivos individuales, mientras que Zlib comprime principalmente flujos de datos. Los algoritmos usan el Algoritmo de compresión desinflado para la compresión, aunque Gzip ofrece funciones adicionales, como la comprobación de errores y metadatos de archivos.

Gzip ha proporcionado mejores relaciones de compresión que Zlib. Sin embargo, Gzip requiere más poder de procesamiento para comprimir y descomprimir datos. En la mayoría de los casos, debe usar Gzip para comprimir archivos y Zlib para comprimir flujos de datos.

Go proporciona la funcionalidad para comprimir datos, incluidos archivos a través del paquete de compresión .

El paquete de compresión

contenido del paquete de compresas

El paquete compress admite la compresión de datos a través de los paquetes compress/gzip y compress/zlib , entre otras funcionalidades.

El paquete gzip admite la compresión y descompresión de los datos en formato de archivo gzip, incluidas las operaciones de lectura y escritura como se especifica en RFC 1952 . Mientras que el paquete zlib ayuda a comprimir y descomprimir datos en formato zlib.

Puede importar gzip y zlib desde el paquete de compresión usando la palabra clave de importación .

import (
    "compress/gzip" // import gzip

    "compress/zlib" // import zlib
)

Comprimir y descomprimir archivos con Gzip

Gzip es un formato de archivo y una aplicación de software para la compresión y descompresión de archivos. Gzip usa el algoritmo de cadena Lempel-Ziv-Markov (LZ77) para comprimir datos, y el algoritmo se usa a menudo para comprimir archivos de texto, como archivos HTML, CSS o JavaScript.

El proceso de compresión de archivos con el paquete gzip es sencillo e intuitivo. Deberá abrir el archivo, crear un archivo comprimido con gzip, crear un editor gzip y copiar el contenido del archivo original en el editor gzip antes de la operación de vaciado que garantiza que se complete el proceso de escritura.

Ejecute este comando bash en la terminal de su directorio de trabajo en sistemas Unix para crear un archivo de texto de muestra y luego inserte texto en el archivo.

// creates a text file.
touch example.txt

// pipes the string to the file
echo 'Hello, world!' > example.txt}

Después de crear el archivo e insertar el texto, puede importar los paquetes gzip , io y os para la operación de compresión.

Así es como puede usar el paquete compress/gzip para comprimir un archivo de texto.

import (
    "compress/gzip"
    "io"
    "os"
)

func main() {
    // Open the original file
    originalFile, err: = os.Open("example.txt")
    if err! = nil {
        panic(err)
    }
    defer originalFile.Close()

    // Create a new gzipped file
    gzippedFile, err: = os.Create("example.txt.gz")
    if err! = nil {
        panic(err)
    }
    defer gzippedFile.Close()

    // Create a new gzip writer
    gzipWriter: = gzip.NewWriter(gzippedFile)
    defer gzipWriter.Close()

    // Copy the contents of the original file to the gzip writer
    _, err = io.Copy(gzipWriter, originalFile)
    if err! = nil {
        panic(err)
    }

    // Flush the gzip writer to ensure all data is written
    gzipWriter.Flush()
}

La función Abrir del paquete os abre el archivo de texto y la función Cerrar cierra el archivo con una declaración diferida . La función Crear crea un archivo comprimido con gzip y la función NewWriter del paquete gzip escribe el contenido del archivo de texto en el archivo gzip mediante la función Copiar del paquete io .

El método Flush de la instancia gzipWriter vacía el escritor gzip una vez que todos los datos están disponibles en el archivo comprimido.

Puede recuperar el archivo original de un archivo comprimido con gzip a través de un proceso de descompresión. El proceso de descompresión de un archivo es similar; abrirá el archivo y creará un lector de archivos gzip, luego creará un nuevo archivo para contener los datos sin comprimir antes de copiar el contenido en el nuevo archivo.

import (
    "compress/gzip"
    "io"
    "os"
)

func main() {
    // Open the gzipped file
    gzippedFile, err: = os.Open("example.txt.gz")
    if err! = nil {
        panic(err)
    }
    defer gzippedFile.Close()

    // Create a new gzip reader
    gzipReader, err: = gzip.NewReader(gzippedFile)
    defer gzipReader.Close()

    // Create a new file to hold the uncompressed data
    uncompressedFile, err: = os.Create("example.txt")
    if err! = nil {
        panic(err)
    }
    defer uncompressedFile.Close()

    // Copy the contents of the gzip reader to the new file
    _, err = io.Copy(uncompressedFile, gzipReader)
    if err! = nil {
        panic(err)
    }
}

La función Abrir del paquete os abre el archivo comprimido con gzip y la función NewReader del paquete gzip lee el archivo comprimido. La función Create del paquete os crea un nuevo archivo de texto. La función Copiar copia el contenido de gzipReader en el archivo sin comprimir .

Comprimir y descomprimir datos con Zlib

Zlib es una biblioteca para compresión y descompresión de datos; la biblioteca también utiliza el algoritmo LZ77. Zlib está escrito en C y se usa ampliamente como base para otras bibliotecas y software de compresión. A diferencia de gzip , zlib es una biblioteca y zlib no incluye un formato de archivo. Sin embargo, a menudo se usa para comprimir datos almacenados en formatos de contenedor, como PNG o HTTP.

El proceso de compresión con zlib es el mismo que para gzip. Creará un archivo zlib, configurará un editor, abrirá el archivo original y copiará el contenido en el archivo comprimido.

import (
   "compress/zlib"
   "io"
   "os"
)

func main() {
   // Create a new file "example.zlib"
   file, err: = os.Create("example.zlib")
   // If error occurs, panic and stop the program
   if err! = nil {
       panic(err)
   }
   // Ensure that the file is closed after the function returns
   defer file.Close()

   // Create a new zlib writer with the best compression level
   writer, err: = zlib.NewWriterLevel(file, zlib.BestCompression)
   // If error occurs, panic and stop the program
   if err! = nil {
       panic(err)
   }
   // Ensure that the writer is closed after the function returns
   defer writer.Close()

   // Open the input file "example.txt"
   inputFile, err: = os.Open("example.txt")
   // If error occurs, panic and stop the program
   if err! = nil {
       panic(err)
   }
   // Ensure that the input file is closed after the function returns
   defer inputFile.Close()

   // Copy the contents of the input file to the writer
   io.Copy(writer, inputFile)
}

El método Create crea el archivo zlib y la función NewWriterLevel crea un escritor para el archivo con la opción especificada (en este caso, la opción BestCompression ). El método Abrir del paquete os abre el archivo de texto y la función Copiar del paquete io copia el contenido del archivo de texto en el archivo zlib en el proceso de compresión.

Para descomprimir el archivo zlib, deberá abrir el archivo comprimido, crear un nuevo lector zlib y, finalmente, copiar el contenido del lector a la salida estándar.

import (
   "compress/zlib"
   "io"
   "os"
)

func main() {
   // Open the compressed file "compressed_file.zlib"
   file, err: = os.Open("compressed_file.zlib")
   // If error occurs, panic and stop the program
   if err! = nil {
       panic(err)
   }
   // Ensure that the file is closed after the function returns
   defer file.Close()

   // Create a new zlib reader for the compressed file
   reader, err: = zlib.NewReader(file)
   // If error occurs, panic and stop the program
   if err! = nil {
       panic(err)
   }
   // Ensure that the reader is closed after the function returns
   defer reader.Close()

   // Copy the contents of the reader to the standard output
   io.Copy(os.Stdout, reader)
}

La función principal abre el archivo zlib con la función Abrir del paquete os , y la función NewReader del paquete zlib lee el archivo zlib en una instancia de lector. El método Copy del paquete io copia el contenido del lector a la salida estándar (en este caso, la consola).

salida de texto en el archivo comprimido

Utilice estas herramientas para la compresión de archivos

Escribir código para la compresión de archivos es útil para automatizar tareas y comprimir varios archivos. Si solo necesitas comprimir algunos archivos, puedes recurrir al uso de aplicaciones como WinRar, WinZip, Express Zip y Bandizip.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *