Compresión de archivos con .Net

miércoles, 27 de enero de 2010
Muchas veces nos vemos en la necesidad de enviar información generada por una aplicación hacia un cliente, pero esta es demasiado grande o tiene demasiadas partes como para realizar una sola tarea para lograr el objetivo, compresión de archivos es una solución.

.Net Framework nos permite comprimir archivos o informacion en memoria haciendo uso del namespace System.IO.Compression.

Este namespace contiene 2 clases que representan a los 2 algoritmos de compresion que vienen incorporados con .Net, Deflate y GZip, el codigo que se presenta mas adelante utiliza GZip.


using System;
using System.IO;
using System.IO.Compression;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public class CompressClass
{
    private byte[] LeerBytes(Stream param)
    {
        byte[] buffer = new byte[param.Length];
        using (MemoryStream ms = new MemoryStream())
        {
            int bytesRead = 0;
            do
            {
                bytesRead = param.Read(buffer, 0, buffer.Length);
                if (bytesRead > 0)
                {
                    ms.Write(buffer, 0, bytesRead);
                }
            } while (bytesRead > 0);

            return ms.ToArray();
        }
    }
    public static byte[] GetCompression(Stream param)
    {
        using (MemoryStream memoria = new MemoryStream())
        {
            using (GZipStream algoritmogzip = new GZipStream(memoria, CompressionMode.Compress, true))
            {
                algoritmogzip.Write(LeerBytes(param), 0, (int)param.Length);
            }
            return memoria.ToArray();
        }
    }
}

Como podrán ver por el código, es muy sencillo, no hay para que complicarse.

El resultado o retorno del método lo he dejado intencionalmente como un arreglo de bytes, esto para que se pueda utilizarlo como respuesta de un response en u entorno web o para que lo carguen al objeto stream de su preferencia.

Somo usar la clase
byte[] compressInfo = CompressClass.GetCompression(new StreamReader(Server.MapPath("images/piechart.tiff"), true).BaseStream);

0 comments:

Publicar un comentario