Cómo Descargar y Extraer Archivos Gzipped con C#

En el mundo impulsado por datos de hoy, es posible que te encuentres necesitando descargar y procesar archivos regularmente. Una tarea común implica descargar archivos gzipped, pero hacerlo en C# puede ser complicado si no estás familiarizado con los métodos correctos. Esta guía te llevará a través de los pasos para descargar y extraer un archivo gzipped programáticamente utilizando C#.

El Problema: Descargar Archivos Gzipped

Muchos sitios web alojan datos en formatos comprimidos como gzip para ahorrar ancho de banda. Por ejemplo, la URL http://data.dot.state.mn.us/dds/det_sample.xml.gz apunta a un archivo XML gzipped. Si necesitas descargar, extraer y guardar este archivo en tu disco, necesitarás saber cómo hacerlo efectivamente en C#.

La Solución: Guía Paso a Paso

1. Descargar el Archivo Gzipped

Para descargar un archivo gzipped, puedes usar las clases WebRequest o WebClient disponibles en .NET. A continuación, se presenta un ejemplo utilizando la clase WebClient por su simplicidad.

using System.Net;

string url = "http://data.dot.state.mn.us/dds/det_sample.xml.gz";
string savePath = @"C:\path\to\your\det_sample.xml.gz";

using (WebClient webClient = new WebClient())
{
    webClient.DownloadFile(url, savePath);
}
  • Explicación:
    • WebClient se utiliza para descargar archivos de la web.
    • El método DownloadFile toma la URL del archivo gzipped y la ruta local donde deseas guardarlo.

2. Extrayendo el Contenido Gzipped

Después de haber descargado el archivo gzipped, el siguiente paso es extraer su contenido. Para esto, utilizaremos la clase GZipStream.

Ejemplo de Código de Descompresión

using System.IO;
using System.IO.Compression;

string gzippedFilePath = @"C:\path\to\your\det_sample.xml.gz";
string outputFilePath = @"C:\path\to\your\det_sample.xml";

using (FileStream fInStream = new FileStream(gzippedFilePath, FileMode.Open, FileAccess.Read))
{
    using (GZipStream zipStream = new GZipStream(fInStream, CompressionMode.Decompress))
    {
        using (FileStream fOutStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
        {
            byte[] tempBytes = new byte[4096];
            int bytesRead;
            while ((bytesRead = zipStream.Read(tempBytes, 0, tempBytes.Length)) != 0)
            {
                fOutStream.Write(tempBytes, 0, bytesRead);
            }
        }
    }
}
  • Explicación:
    • Primero, crea un FileStream para leer el archivo gzipped.
    • Luego, envuelve ese flujo en un GZipStream para manejar la descompresión.
    • Finalmente, crea otro FileStream para escribir el contenido descomprimido en un nuevo archivo.

Resumen de Pasos

  1. Descarga el archivo utilizando WebClient.
  2. Abre el archivo gzipped con un FileStream.
  3. Envuelve en un GZipStream para la descompresión.
  4. Escribe la salida en un nuevo archivo utilizando otro FileStream.

Siguiendo estos pasos, puedes automatizar fácilmente el proceso de descarga y extracción de archivos gzipped utilizando C#.

Conclusión

Manejar archivos gzipped en C# es sencillo una vez que comprendes las clases y métodos necesarios. Con solo unas pocas líneas de código, puedes descargar y extraer de manera eficiente cualquier contenido gzipped que necesites.

Para más información sobre compresión y manejo de archivos en C#, considera consultar la documentación oficial de Microsoft.