Xceed .NET Libraries Documentation
Creating a GZip file

Welcome to Xceed .NET, .NET Standard and Xamarin Libraries! > Basic Concepts > Zip and streaming capabilities > Streaming compression > Compressing > Creating a GZip file

This topic demonstrates how to create a GZip file (. gz). Although Xceed's streaming compression component supports GZip files, it does not support tar files. 

Jump to the Decompressing a GZip file topic to learn how to decompress a GZip file.

Basic steps

To create a GZip file, the following steps must be taken:

  1. Create the source stream from which the data will be read. For the purposes of this example, our source stream will be a FileStream.
  2. Create the destination FileStream to which the GZip compressed data will be written. We will give the destination file a . gz extension to stay compatible with popular GZip softwares.
  3. Create a GZipCompressedStream around the destination FileStream.
  4. Read the uncompressed data from the source stream.
  5. Write the data to the compressed stream object. Writing to the object compresses the data and, in turn, writes the compressed data to the destination stream.

Example

The following example demonstrates how to create a GZip file from a source FileStream.

using Xceed.Compression;

using Xceed.Compression.Formats;



namespace FileSystemDocumentationExamples.CompressionComponent

{

  public class CompressGZipCompressedStreamExample

  {

    public void MyMainMethod()

    {

      /* Because Xceed.Compression.Formats is an optional assembly not automatically

         unlocked by Xceed Zip for .NET, we must explicitly set our license key to it

         before use or else an exception will be thrown. */

      Xceed.Compression.Formats.Licenser.LicenseKey = "<your Xceed Zip for .NET license key>";

    }



    public void Example()

    {

      /* Setup a destination data stream. This can be any Stream object for any destination as

         long as data can be written to it. No 'seek' or 'read' capabilities are needed. */

      FileStream destinationStream = new FileStream( @"D:\Data.gz", FileMode.Create, FileAccess.Write, FileShare.None );



      /* Setup a source data stream. This can be any Stream object from any source as

         long as data can be read from it. No 'seek' or 'write' capabilities are needed. */

      using( FileStream sourceStream = new FileStream( @"D:\Data.dat", FileMode.Open, FileAccess.Read, FileShare.Read ) )

      {

        /* Optional: the compression level can be specified. */

        CompressionLevel compressionLevel = CompressionLevel.Normal;

        

        // Create a GZip compressed stream that wraps around our destination stream

        using( GZipCompressedStream gzipCompressedStream = new GZipCompressedStream( destinationStream, compressionLevel ) )

        {

          /* The GZipCompressedStream automatically closes the destination

             stream. So there is no need to declare the stream within a using

             statement or to call Close() once we are done with the stream.

            

             If you do not want the inner stream to be closed by the GZipCompressedStream,

             set its Transient property to true. */



          // Optional: Prevent XceedCompressedStream from closing 'destinationStream' automatically

          //gzipCompressedStream.Transient = true;



          int bytesRead;



          // Setup a 32K buffer

          byte[] buffer = new byte[ 32 * 1024 ];



          // Read from the source stream until there is no more data

          while( ( bytesRead = sourceStream.Read( buffer, 0, buffer.Length ) ) > 0 )

          {

            // Compress the data by writing into the compressed stream

            // Compressed data will be written into its InnerStream, in our case, 'destinationStream'

            gzipCompressedStream.Write( buffer, 0, bytesRead );

          }

        }

      }

    }

  }

}
Imports Xceed.Compression

Imports Xceed.Compression.Formats



Namespace FileSystemDocumentationExamples.CompressionComponent

  Public Class CompressGZipCompressedStreamExample

    Public Sub MyMainMethod()

'       Because Xceed.Compression.Formats is an optional assembly not automatically

'         unlocked by Xceed Zip for .NET, we must explicitly set our license key to it

'         before use or else an exception will be thrown. 

      Xceed.Compression.Formats.Licenser.LicenseKey = "<your Xceed Zip for .NET license key>"

    End Sub



    Public Sub Example()

'       Setup a destination data stream. This can be any Stream object for any destination as

'         long as data can be written to it. No 'seek' or 'read' capabilities are needed. 

      Dim destinationStream As New FileStream("D:\Data.gz", FileMode.Create, FileAccess.Write, FileShare.None)



'       Setup a source data stream. This can be any Stream object from any source as

'         long as data can be read from it. No 'seek' or 'write' capabilities are needed. 

      Using sourceStream As New FileStream("D:\Data.dat", FileMode.Open, FileAccess.Read, FileShare.Read)

        ' Optional: the compression level can be specified. 

        Dim compressionLevel As CompressionLevel = CompressionLevel.Normal



        ' Create a GZip compressed stream that wraps around our destination stream

        Using gzipCompressedStream As New GZipCompressedStream(destinationStream, compressionLevel)

'           The GZipCompressedStream automatically closes the destination

'             stream. So there is no need to declare the stream within a using

'             statement or to call Close() once we are done with the stream.

'            

'             If you do not want the inner stream to be closed by the GZipCompressedStream,

'             set its Transient property to true. 



          ' Optional: Prevent XceedCompressedStream from closing 'destinationStream' automatically

          'gzipCompressedStream.Transient = true;



          Dim bytesRead As Integer



          ' Setup a 32K buffer

          Dim buffer(32 * 1024 - 1) As Byte



          ' Read from the source stream until there is no more data

          bytesRead = sourceStream.Read(buffer, 0, buffer.Length)

          Do While bytesRead > 0

            ' Compress the data by writing into the compressed stream

            ' Compressed data will be written into its InnerStream, in our case, 'destinationStream'

            gzipCompressedStream.Write(buffer, 0, bytesRead)

            bytesRead = sourceStream.Read(buffer, 0, buffer.Length)

          Loop

        End Using

      End Using

    End Sub

  End Class

End Namespace