Desenvolvimento - C#

Compactação com GZipStream e DeflateStream

Um recurso bastante útil que foi incluído no .NET 2.0 foi o suporte à compatação GZip, por 2 métodos: GZipStream e DeflateStream, ambos presentes no namespace System.IO.Compression.

por Rodolfo Paoni



Um recurso bastante útil que foi incluído no .NET 2.0 foi o suporte à compatação GZip, por 2 métodos: GZipStream e DeflateStream, ambos presentes no namespace System.IO.Compression. A diferença entre essas classes está no algoritmo de compressão. Ambas possuem uma enumeration chamada CompressionMode onde pode ser definido o nível de compressão utilizado. Abaixo demonstro uma classe com 4 métodos básicos para compressão e descompresão em cada um dos algoritmos, onde os parâmetros são o arquivo de origem e o arquivo de destino, respectivamente.
public static class Compact
{
    public static void GzCompressFile(string arqOrigem, string arqCompactado)
    {
        try
        {
            using (FileStream sourceFile = File.OpenRead(arqOrigem))
            {
                using (FileStream destFile = File.Create(arqCompactado))
                {
                    using (GZipStream compstream = new GZipStream(destFile, CompressionMode.Compress))
                    {
                        const int buf_size = 8192;
                        byte[] buffer = new byte[buf_size];
                        int bytes_read = 0;
                        do
                        {
                            bytes_read = sourceFile.Read(buffer, 0, buf_size);
                            compstream.Write(buffer, 0, bytes_read);
                        } while (bytes_read != 0);
                    }
                }
            }
        }
        catch { }
    }

    public static void GzDecompressFile(string arqCompactado, string arqDestino)
    {
        try
        {
            using (FileStream sourceFile = File.OpenRead(arqCompactado))
            {
                using (FileStream destFile = File.Create(arqDestino))
                {
                    using (GZipStream compstream = new GZipStream(sourceFile, CompressionMode.Decompress))
                    {
                        int theByte = compstream.ReadByte();
                        while (theByte != -1)
                        {
                            destFile.WriteByte((byte)theByte);
                            theByte = compstream.ReadByte();
                        }
                    }
                }
            }
        }
        catch { }
    }

    public static void DfCompressFile(string arqOrigem, string arqCompactado)
    {
        try
        {
            using (FileStream sourceFile = File.OpenRead(arqOrigem))
            {
                using (FileStream destFile = File.Create(arqCompactado))
                {
                    using (DeflateStream compstream = new DeflateStream(destFile, CompressionMode.Compress))
                    {
                        const int buf_size = 8192;
                        byte[] buffer = new byte[buf_size];
                        int bytes_read = 0;
                        do
                        {
                            bytes_read = sourceFile.Read(buffer, 0, buf_size);
                            compstream.Write(buffer, 0, bytes_read);
                        } while (bytes_read != 0);
                    }
                }
            }
        }
        catch { }
    }

    public static void DfDecompressFile(string arqCompactado, string arqDestino)
    {
        try
        {
            using (FileStream sourceFile = File.OpenRead(arqCompactado))
            {
                using (FileStream destFile = File.Create(arqDestino))
                {
                    using (DeflateStream compstream = new DeflateStream(sourceFile, CompressionMode.Decompress))
                    {
                        int theByte = compstream.ReadByte();
                        while (theByte != -1)
                        {
                            destFile.WriteByte((byte)theByte);
                            theByte = compstream.ReadByte();
                        }
                    }
                }
            }
        }
        catch { }
    }
}

Espero ter ajudado,

Abraços
Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni