[dba-VB] C# - zip / unzip

Gustav Brock Gustav at cactus.dk
Thu Dec 10 04:22:54 CST 2009


Hi Michael

Neither have I, but I googled a little on the "zubject" and several links tell that this GZip compression is not compatible with WinZip and the like because of missing file info, in other words it should be fine for compressing and decompressing a stream (which of course can be written/read to/from a file) but that's all.

A bit strange that this widely used function is missing from the framework.

/gustav


>>> michael at ddisolutions.com.au 10-12-2009 00:11 >>>
I've never used it but there are builtin libraries for
zipping/unzipping.
Look in System.IO.Compression

The help file looks, well, helpfull for a change :-)

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

public class GZipTest
{
    private const int buffer_size = 100;

    public static int ReadAllBytesFromStream(Stream stream, byte[]
buffer)
    {
        // Use this method is used to read all bytes from a stream.
        int offset = 0;
        int totalCount = 0;
        while (true)
        {
            int bytesRead = stream.Read(buffer, offset, buffer_size);
            if (bytesRead == 0)
            {
                break;
            }
            offset += bytesRead;
            totalCount += bytesRead;
        }
        return totalCount;
    }

    public static bool CompareData(byte[] buf1, int len1, byte[] buf2,
int len2)
    {
        // Use this method to compare data from two different buffers.
        if (len1 != len2)
        {
            Console.WriteLine("Number of bytes in two buffer are
different {0}:{1}", len1, len2);
            return false;
        }

        for (int i = 0; i < len1; i++)
        {
            if (buf1[i] != buf2[i])
            {
                Console.WriteLine("byte {0} is different {1}|{2}", i,
buf1[i], buf2[i]);
                return false;
            }
        }
        Console.WriteLine("All bytes compare.");
        return true;
    }

    public static void GZipCompressDecompress(string filename)
    {
        Console.WriteLine("Test compression and decompression on file
{0}", filename);
        FileStream infile;
        try
        {
            // Open the file as a FileStream object.
            infile = new FileStream(filename, FileMode.Open,
FileAccess.Read, FileShare.Read);
            byte[] buffer = new byte[infile.Length];
            // Read the file to ensure it is readable.
            int count = infile.Read(buffer, 0, buffer.Length);
            if (count != buffer.Length)
            {
                infile.Close();
                Console.WriteLine("Test Failed: Unable to read data from
file");
                return;
            }
            infile.Close();
            MemoryStream ms = new MemoryStream();
            // Use the newly created memory stream for the compressed
data.
            GZipStream compressedzipStream = new GZipStream(ms,
CompressionMode.Compress, true);
            Console.WriteLine("Compression");
            compressedzipStream.Write(buffer, 0, buffer.Length);
            // Close the stream.
            compressedzipStream.Close();
            Console.WriteLine("Original size: {0}, Compressed size:
{1}", buffer.Length, ms.Length);

            // Reset the memory stream position to begin decompression.
            ms.Position = 0;
            GZipStream zipStream = new GZipStream(ms,
CompressionMode.Decompress);
            Console.WriteLine("Decompression");
            byte[] decompressedBuffer = new byte[buffer.Length +
buffer_size];
            // Use the ReadAllBytesFromStream to read the stream.
            int totalCount = GZipTest.ReadAllBytesFromStream(zipStream,
decompressedBuffer);
            Console.WriteLine("Decompressed {0} bytes", totalCount);

            if (!GZipTest.CompareData(buffer, buffer.Length,
decompressedBuffer, totalCount))
            {
                Console.WriteLine("Error. The two buffers did not
compare.");
            }
            zipStream.Close();
        } // end try
        catch (InvalidDataException)
        {
            Console.WriteLine("Error: The file being read contains
invalid data.");
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Error:The file specified was not
found.");
        }
        catch (ArgumentException)
        {
            Console.WriteLine("Error: path is a zero-length string,
contains only white space, or contains one or more invalid characters");
        }
        catch (PathTooLongException)
        {
            Console.WriteLine("Error: The specified path, file name, or
both exceed the system-defined maximum length. For example, on
Windows-based platforms, paths must be less than 248 characters, and
file names must be less than 260 characters.");
        }
        catch (DirectoryNotFoundException)
        {
            Console.WriteLine("Error: The specified path is invalid,
such as being on an unmapped drive.");
        }
        catch (IOException)
        {
            Console.WriteLine("Error: An I/O error occurred while
opening the file.");
        }
        catch (UnauthorizedAccessException)
        {
            Console.WriteLine("Error: path specified a file that is
read-only, the path is a directory, or caller does not have the required
permissions.");
        }
        catch (IndexOutOfRangeException)
        {
            Console.WriteLine("Error: You must provide parameters for
MyGZIP.");
        }
    }

    public static void Main(string[] args)
    {
        string usageText = "Usage: MYGZIP <inputfilename>";
        //If no file name is specified, write usage text.
        if (args.Length == 0)
        {
            Console.WriteLine(usageText);
        }
        else
        {
            if (File.Exists(args[0]))
                GZipCompressDecompress(args[0]);
        }
    }
}

Cheers

Michael M


 > Have a look for DotNetNuke sources

Thanks, but I am quite sure I would just get lost.  You have way too
much faith in my C# abilities 
at this point in time.  ;)

I have found at least two dlls that can be referenced and used from C#.
Each claims to be "managed 
code" and make the source available, though what that is worth to me is
not clear.  I just want 
something that is easy to use and documented so I can figure out how to
use it.  I have a lot of 
uses for zip files, from zipping up archives of files for near line
storage to making true zip files 
for shipping to clients.

John W. Colby
www.ColbyConsulting.com 


Shamil Salakhetdinov wrote:
> Hi John,
> 
> Have a look for DotNetNuke sources - they have free sources for
> zipping/unzipping.
> Those sources are used in core DNN functionality (modules setup) - IOW they
> tested well, they are stable and thry work very well.
> 
> --
> Shamil
> 
> -----Original Message-----
> From: dba-vb-bounces at databaseadvisors.com 
> [mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of jwcolby
> Sent: Wednesday, December 09, 2009 8:42 PM
> To: VBA
> Subject: [dba-VB] C# - zip / unzip
> 
> Any recommendations for a well supported (bugs are fixed) library for zip /
> unzip for .net?





More information about the dba-VB mailing list