Compression and Decompression of Files using Visual Basic 2005
page 4 of 9
by Abhishek Kumar Singh
Average Rating: 
Views (Total / Last 10 Days): 106655/ 189

Implementation of GZipStream in VB 2005

Implementation of GZipStream compression

GZipStream class provides methods which can be used to compress and decompress data or files into a zip archive.

Listing 1 – Function to compress Byte array data and returns compressed Byte array

''' <summary>
'''  Byte to Byte compression.
''' </summary>
''' <param name="byteSource"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CompressByte(ByVal byteSource() As ByteAs Byte()
  ' Create a GZipStream object and memory stream object to store compressed stream
  Dim objMemStream As New MemoryStream()
  Dim objGZipStream As New GZipStream(objMemStream, CompressionMode.Compress, True)
  objGZipStream.Write(byteSource, 0, byteSource.Length)
  objMemStream.Position = 0
  ' Write compressed memory stream into byte array
  Dim buffer(objMemStream.Length) As Byte
  objMemStream.Read(buffer, 0, buffer.Length)
  Return buffer
End Function


·         objGZipStream.Write (byteSource, 0, byteSource.Length) converts the source byte array into compressed stream and writes it into GZipStream object.

·          objMemStream.Position = 0 sets the current position of the compressed stream to the beginning. Note that it is necessary to position at 0 for point it the header of stream.

·         objMemStream.Read(buffer, 0, buffer.Length) writes the compressed memory stream into byte array buffer.

Listing 2 – Function to compress Byte array data and returns compressed memory stream

''' <summary>
''' Byte to stream compression.
''' </summary>
''' <param name="byteSource"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CompressData(ByVal byteSource As Byte()) As MemoryStream
  ' Create the streams and byte arrays needed
  Dim byteBuffer As Byte() = Nothing
  Dim objSourceMemStream As MemoryStream = Nothing
  Dim objDestinationStream As New MemoryStream
  Dim compressedStream As GZipStream = Nothing
  objSourceMemStream = New MemoryStream(byteSource)
  byteBuffer = New Byte(objSourceMemStream.Length) {}
  Dim checkCounter As Integer = objSourceMemStream.Read(byteBuffer, 0, byteBuffer.Length)
  compressedStream = New GZipStream(objDestinationStream, CompressionMode.Compress, True)
  ' close all streams
  If Not (objSourceMemStream Is NothingThen
  End If
  If Not (compressedStream Is NothingThen
  End If
  If Not (objDestinationStream Is NothingThen
  End If
  ' Return compressed array of bytes
  Return objDestinationStream
End Function


·         objSourceMemStream = New MemoryStream(byteSource) initializes memory stream with the source byte array.

·         objSourceMemStream.Read(byteBuffer, 0, byteBuffer.Length) reads the source stream values into the output byte array(byteBuffer() in this example).

·         compressedStream = New GZipStream(objDestinationStream, CompressionMode.Compress, True) create a compressed stream pointing to the destination stream.

Listing 3 – Function to decompress the compressed Byte array

''' <summary>
''' Decompress the byte array (compressed) by using GZipStream class library.
''' </summary>
''' <param name="byteCompressed">Compressed Byte()</param>
''' <returns>Decompressed Byte()</returns>
''' <remarks></remarks>
Public Function DecompressByte(ByVal byteCompressed() As ByteAs Byte()
  ' Initialize memory stream with byte array.
  Dim objMemStream As New MemoryStream(byteCompressed)
  ' Initialize GZipStream object with memory stream.
  Dim objGZipStream As New GZipStream(objMemStream, CompressionMode.Decompress)
  ' Define a byte array to store header part from compressed stream.
  Dim sizeBytes(3) As Byte
  ' Read the size of compressed stream.
  objMemStream.Position = objMemStream.Length - 5
  objMemStream.Read(sizeBytes, 0, 4)
  Dim iOutputSize As Integer = BitConverter.ToInt32(sizeBytes, 0)
  ' Posistion the to point at beginning of the memory stream to read
  ' compressed stream for decompression.
  objMemStream.Position = 0
  Dim decompressedBytes(iOutputSize - 1) As Byte
  ' Read the decompress bytes and write it into result byte array.
  objGZipStream.Read(decompressedBytes, 0, iOutputSize)
  Return decompressedBytes
  Catch ex As Exception
  Return Nothing
  End Try
End Function


·         objMemStream.Position = objMemStream.Length - 5  and objMemStream.Read(sizeBytes, 0, 4) reads the size of the actual stream which is coded at the last portion in compressed stream.

·         objGZipStream.Read(decompressedBytes, 0, iOutputSize) reads the decompress bytes and write it into result byte array.

Implementation of GZipStream decompression

Listing 4 – Function to decompress the compressed memory stream

''' <summary>
''' Function to decompress the memory stream(compressed) by using GZipStream class library.
''' Note that, it is important for the caller to do the compressing with GZipStream.
''' </summary>
''' <param name="compressedStream">MemoryStream (compressed)</param>
''' <param name="buffLength">Required size of result byte()</param>
''' <returns>Byte() (decompressed)</returns>
''' <remarks></remarks>
Public Function DecompressData(ByVal compressedStream As MemoryStream, _
ByVal buffLength As ULong) As Byte()
  compressedStream.Position = 0
  Dim zipStream As New GZipStream(compressedStream, CompressionMode.Decompress)
  Dim decompressedBuffer(buffLength + 100) As Byte
  ' Use the ReadAllBytesFromStream to read the stream.
  Dim totalCount As Integer = ReadAllBytesFromStream(zipStream, decompressedBuffer)
  Return decompressedBuffer
End Function


·         compressedStream.Position = 0 resets the memory stream position to begin decompression.

·         Dim zipStream As New GZipStream(compressedStream, CompressionMode.Decompress) converts compressed stream into uncompressed stream.

·         ReadAllBytesFromStream(zipStream, decompressedBuffer) is used to get the size of the uncompressed byte array from uncompressed stream. See Listing 5 for the definition of function ReadAllBytesFromStream.

Listing 5 – Function to get the required maximum size of byte array for memory stream

''' <summary>
''' To get size of byte of the memory stream.
''' </summary>
''' <param name="stream">Input memory stream</param>
''' <param name="buffer"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function ReadAllBytesFromStream(ByVal stream As Stream, _
ByVal buffer As Byte()) As Integer
  ' Use this method is used to read all bytes from a stream.
  Dim offset As Integer = 0
  Dim totalCount As Integer = 0
  While True
    Dim bytesRead As Integer = stream.Read(buffer, offset, 100)
    If bytesRead = 0 Then
      Exit While
    End If
    offset + = bytesRead
    totalCount + = bytesRead
    End While
    Return totalCount
  End Function 'ReadAllBytesFromStream


Function ReadAllBytesFromStream reads memory stream in loop of 100 bytes each and returns the total size. You can specify other values to the maximum number of bytes to read from stream.

View Entire Article

User Comments

Title: soulpink   
Name: soul
Date: 2013-01-28 1:55:01 AM
Mr. Singh, you have this kind of helping-hand and mind tutorial. It helps a lot. Thank you.
Title: soulpink   
Name: soul
Date: 2013-01-28 1:51:59 AM
awesome. it helps a lot. thank you so much.excellent work guys..
Title: ghufran   
Name: kamal
Date: 2012-09-06 12:20:10 AM
i have need for demo file and source code
Title: Thanks   
Date: 2012-06-16 10:08:54 AM
Amazing, thanks a lot.. this is very usefu
Title: Re   
Name: rajanrufus
Date: 2011-12-27 8:03:35 PM
Excellent post and informative. Thanks for your sharing.
Title: Gzip   
Name: Ron
Date: 2011-01-09 10:58:31 PM
Can you help me with that problem?

how ca I compress database with a size of 1 gigabyte or more than.

thank you!
Title: Gzip   
Name: John Michael
Date: 2011-01-09 10:49:33 PM
I think your code is Useless,
I tried it but it can not compress a large file such as database with a size of 1 Gigabyte or more than.
Title: lklkl   
Name: lkl
Date: 2011-01-02 8:29:17 AM
not to bad
Title: Forgot something   
Name: Jake the snake
Date: 2010-11-12 3:49:28 PM
Nice code, this is very useful. However, there is an error in your code. You are not assigning the values selected in the OpenFileDialog and FolderBrowserDialog to the text windows so when you select a file nothing shows up in the text box and same with the folder.

Code fails
Title: file compression/decompression in VC++ 2005   
Name: jay
Date: 2010-10-22 8:30:06 PM
i like your tuturial
i want your help in file compression
how i can write the file compression/decompression code in Visual C++ 2005
please help me
my email id
Title: Compressed (zipped) Folders Error   
Name: Rahul
Date: 2010-05-24 7:35:33 AM
Hi, thx for such a nice article, i have implemented the code in my application and able to generate .zip file but unfortunately i couldn't ablr to open or extract content of zip file, it is throwing error as below :
The Compressed (zipped) Folder is invalid or corrupted.

Could you please help? (
Title: file compression/decompression in VC++ 2005   
Name: jay
Date: 2010-02-05 12:36:14 AM
i like your tuturial
i want your help in file compression
how i can write the file compression/decompression code in Visual C++ 2005
please help me
my email id
Title: file compression/decompression in VC++ 2005   
Name: jay
Date: 2010-02-03 1:35:12 PM
i like your tuturial
i want your help in file compression
how i can write the file compression/decompression code in Visual C++ 2005
please help me
Title: Decompressed files are huge   
Name: Raj
Date: 2009-12-10 11:17:57 AM
Great tutorial Abhishek!
One problem that I am noticing is that when decompressing a file the file becomes almost 100 times the size that it should be. Any idea on where am I going wrong here ?
Title: Very Impressive   
Name: Paul Myers
Date: 2009-09-22 10:14:52 AM
Thank you for this sample code. It is well written and very understandable.
Title: request   
Name: swarup saha
Date: 2009-06-30 12:49:22 PM
dear bhaia,can i get C# code of image compression and decompression.if possible pls send me in this address:
Title: Thank you   
Name: Mikael
Date: 2009-06-30 9:49:22 AM
A thousand thanks, works perfect.
Title: Tanks man   
Name: Tim
Date: 2009-05-05 5:00:45 AM
Hello, thank you for the tutorial, it was great, i love it.
i have som problem but i figure it out, so, now it works, and thanks agen...
Title: Training   
Name: Obama - USA President
Date: 2009-02-05 3:57:12 PM
Great of you to share...yes we can.
Title: help me yaar as soon as   
Name: prince walia
Date: 2008-11-23 12:11:07 PM
hello frnd,,,i m doing mca,,my sar give me aa project to cpmrss the files,,,but my project is nt complete,,plz send me the project oe help me,,
Title: Compression   
Name: Avaloan
Date: 2008-11-23 3:34:22 AM
I think it's good but I don't see any compresses just a expand of file size.!
Title: Compression   
Name: Sree
Date: 2008-10-30 2:21:43 AM
I have used the code in the script task in SQL Integration services. First it gives me an error at the step "objMemStream.Length" saying: disallows implicit conversion from Long to Int.
So i have tried type conversions.
It gets executed and a zip file is created but when i try to decompress it, it says it is bad or invalid file.
Can anybody help me on this?
Title: Compression   
Name: Stacy
Date: 2008-10-02 4:24:41 AM

I am working on an asp application and I have a string that needs to be passed from script file to asp page, but the string breaks coz of its large size.Can this function be used for the same.Also how do i convert string to byte.

Please reply soon
Title: compression   
Name: mike
Date: 2008-09-04 5:31:06 AM
it can't comprees large file...65k is the limit..i hv tried compressing 90k file(TXT FILE) to my surprise the compressed file is showg a larger memory thn its initial size..and there is no or a very little difference between gzip and i doin any mistake here.?.plz help!!!
Title: compression   
Name: Jeevitha
Date: 2008-08-29 9:39:38 AM
Nice Article. It's very useful to me. Thanks a lot.
Title: Compression and Decompression   
Name: Padma
Date: 2008-05-29 2:25:36 AM
Article is very helped me a lot...can u give article abt transferring an image file in vb6 using udp protocol....
PH:080 22195854
Title: Senior Programmer/Analyst   
Name: Guillermo
Date: 2008-05-14 10:23:12 AM
I am very thankful for this article because it helped me very very much...
Title: Senior Programmer/Analyst   
Name: J Eaves
Date: 2008-05-12 11:58:09 AM
Great article and easy to follow. However, 2 issues. 1)I couldn't get code to work with CompressData() as MemoryStream. And 2)After I created a zip file and tried to open with WinZip 11, I get the following error "Cannot open file: it does not appear to be a valid archive."
Does anyone have thoughts or suggestions.
Title: Compression and Decompression of Files using Visual Basic 2005   
Name: Cammie McGinty
Date: 2008-01-27 3:04:27 PM
Thank you for a clear and straightforward example.
Title: Reply to: Bloated results   
Name: Abhishek (Author)
Date: 2007-11-21 2:58:05 AM
hi Jacob,
BTW which type of files you are trying to compress and decompress?
Are you using the byte counters properly if you are not decompressing entire compressed file at a time?
Title: Reply to: Give me idea   
Name: Abhishek (Author)
Date: 2007-11-21 2:55:50 AM
Hi Netra,
sorry for late reply, i had stuck in some stuff.
You can achieve entire folder compression using DeflateStream but for this you have to implement your own logic to compress each file one by one inside the folder and then you can make a bundle of all compress files and also there should be a information file which should keep details of each file name, size etc which you can use while decompressing.
Frankly saying i have done this by myself but had some finding on this.
hope it helps you. If you got anyt idea on this please let me know. I will be thankful to you.
Title: Bloated results   
Name: Jacob Kennedy
Date: 2007-11-02 5:29:13 PM
I'm implementing your DecompressByte on a folder of files that were zipped using GZipStream, and it's working a lot better than what I had, but my decompressed files are ending up over a hundred times bigger than the original non-compressed files... any ideas?
Title: Give me idea   
Name: Netra
Date: 2007-10-22 5:26:55 AM
Hi abhi,
i want to zip the folder containg files for eg. i have folder named ABC and in that folder i have 3 .txt files , i want to zip that ABC folder not only the files in that.
Can i done it at runtime , plz give me the idea. And i want to do it by using DeflateStream.
Title: Excellent idea....   
Name: Rajiv Tripathi
Date: 2007-07-05 3:40:00 PM
Hi Abhi,
That's a really gr8 idea. Thx for sharing it with all of us.That has helped a lot. i hope you remember me by my name, I implemented your idea and it produced remarkable result.
thx & all the best!!
Name: rijo
Date: 2007-06-28 6:23:07 AM
i need an help would u plz contact on this id
Title: Re: File Extension   
Name: Abhishek Kumar Singh
Date: 2007-06-15 7:52:18 PM
As the gzipstream and deflatestream are stream based classes, one way would be- you can add file exetension in byte() at first/last position before compression. Then read those bytes to get the file extenstion and remove those bytes before writing the file.
Usually you need to know the extension of file by any mean while writing decompressed file. If compressed byte() are being transferred using remote methods you can send file extension as extra parameter in the method.

Title: file extension   
Name: Theuns
Date: 2007-06-14 10:45:01 AM
How do you keep the file extension when compressing it?
Title: My Feedback   
Name: Sunny Adeshara
Date: 2007-06-08 8:53:00 AM
I am very thankful for this article because it helped me very much.
Title: Good Article Keep it up   
Name: Anjaiah Keesari
Date: 2007-05-24 9:05:54 AM
Even I am working on Compression and Decompression with C# code your Article is very good. You Explained concepts very nice thanks
Title: I m proud of my best frined   
Name: Vinit Pratap Singh
Date: 2007-05-23 9:13:57 AM
Hi... i don't know Visual Basic.. but i think its a very big implement by you.. i m very proud of u.. keep it up... with lots of new adventure.. .

Product Spotlight
Product Spotlight 

Community Advice: ASP | SQL | XML | Regular Expressions | Windows

©Copyright 1998-2021  |  Page Processed at 2021-12-05 6:38:17 PM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search