GZipStream Sınıfı ve Kullanımı

Eyl 06, 2013
GzipStream sınıfı, .NET 2.0 beraber gelmiş olan dosya sıkıştırma ve açma işlemlerinde standart bir algoritma kullanan gzip veri formatını temsil eder. Gzip “gnu zip” kısaltımış şeklidir. Gzip veri formatı DeflateStream sınıfıyla aynı algoritmayı kullanır, fakat diğer sıkıştırma metotlarını kullanabilmek için türetme yapılabilmektedir. GzipStream sınıfı kullanılarak sıkıştırılan bir dosya .gz uzantılı bir dosyaya yazılır. Bu sınıf 8 gb üzerindeki  dosyaları sıkıştırılamayabilir. Bu sınıf doğası gereği .zip arşivlerine dosya ekleme veya dosya çıkarılması için işlevsellik sağlamaz. DeflateStream ve GzipStream sınıflarının sıkıştırma fonksiyonları stream (akış) açığa çıkarır. Veri bayt bayt okunduğu için eğer kaynak veri önceden sıkıştırılmışsa  ve bu sınıflar kullanılarak tekrar bir sıkıştırılma işlemi uygulanır ise streamlerin boyutu eskisine göre artabilir. GzipStream sınıfının constructor(yapıcısı)’ı
 
public GZipStream(Stream stream,CompressionMode mode,bool leaveOpen);
 
Stream, Compressionmode (sıkştırma modu) ve leaveOpen (açık bırak)’ a göre GzipStream nesnesi yaratılır. Burada stream, işlem yapılacak dosyanın tam yoluyla beraber adıdır. CompressionMode bir enum sabittir ve Compres (sıkıştır), Decompres (sıkıştırıldıktan sonra geri açılmış) şeklinde iki değer alır. Birincisi CompressionMode.Compress belirtilen streamin  sıkıştırılacağını, ikincisi CompressionMode.Decompress sıkıştırılmış streamin açılacağını belirtir. leaveOpen parametresi stream açık bırakılmak istniyorsa true (doğru), aksi takdirde false (yanlış) değeri alır.

GzipStream Sınıfının Bazı Üyeleri (Properties)

GzipStream sınıfından türetme yapmak için CanSeek, CanWrite ve CanRead üyeleri override edilmelidir.
  • CanSeek  : Stream aramayı destekleyip desteklemediğini gösteren bir değer alır. Tüm durumlarda false değerini alır.

  • CanWrite : Stream yazmayı destekleyip desteklemediğini gösteren bir değer alır. Eğer CompressionMode değeri compress, stream okumayı destekliyor ve kapalı değilse bu true değerini aksi halde false değerini alır.

  • CanRead : Sıkıştırılmış bir dosyayı okumayı destekleyip desteklemediğini gösteren bir değer alır. Eğer CompressionMode değeri decompress, stream okumayı destekliyor ve kapalı değilse true değerini aksi halde yanlış değerini alır.

  • CanTimeOut : Mevcut akışın zaman aşımına uğrayıp uğramadığını belirten bir değer alır.

  • CanReadOut : Akışın süre bitmeden önce ne kadarının okunacağını belirten değeri alır.

  • CanWriteOut : Akışın süre bitmeden önce ne kadarının yazılacağını belirten değeri alır.  
GzipStream Sınıfının Bazı Metotdları 
  • Close : Geçerli akışı kapatır ve geçerli akış ile ilgili bütün kaynakları serbest bırakır.

  • CopyTo(Stream) : Mevcut akıştan bayt okur ve bunları hedef akışa yazar.

  • CreateObjRef : Uzak bir nesne ile iletişim kurmakta kullanılan bir proxy oluşturmak için gereken tüm bilgileri içeren bir nesne oluşturur.

  • Dispose : Stream tarafından kullanılan bütün kaynakları serbest bırakır.

  • GetType : Mevcut örneğin türünü alır.

  • Read : Sıkıştırıldıktan sonra geri açılmış baytları, bayt türünden diziden okur.

  • Write : Bayt türünden dizindeki sıkıştırılmış baytları akışa yazar.
UYGULAMA

Aşağıdaki decompres ve compres metodları ile dosya sıkıştırma ve açma işlemlerine örnek verilmiştir.
 

public static void Compress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)

{

    FileStream InputStream = File.Open(ZiplenecekDosyaAdi, FileMode.Open);

    FileStream OutputStream = File.Open(ZipDosyaAdi, FileMode.Create);

    GZipStream ZipStream = new GZipStream(OutputStream, CompressionMode.Compress);

        

    try

    {

        byte[] Buffer = new byte[InputStream.Length];

        InputStream.Read(Buffer, 0, Buffer.Length);

        ZipStream.Write(Buffer, 0, Buffer.Length);

     }

     finally

     {

         OutputStream.Close();

         InputStream.Close();

     }

 

Yukarıdaki metod aşağıdaki gibi kullanılabilir.

Compress("C:\\OnemliDosya.txt", "C:\\OnemliDosya.gz");
 
Metotda sıkıştırmak istenilen dosyanın adı ve oluşturulacak yeni dosyanın adı alınarak, FileStream tanımlanır. Daha sonraki satırda ise bir GZipStream tanımlanarak bu stream içinde sıkıştırılma işlemi yapılır. Sıkıştırma sonucu meydana gelen Stream biraz önce oluşturulan FileStreame atanır. Daha sonra FileStream aracılığı ile sıkıştırmak istenilen dosya okunarak ZipStream içine yazılır. ZipStream için tanımlamış olan FileStream ile sıkıştırılmış dosyanın kaydedilmesi sağladıktan sonra Streamler kapatılır.
 

public static void Decompress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)

{        

    FileStream Input = File.Open(ZiplenecekDosyaAdi, FileMode.Open);

    FileStream Output = File.Open(ZipDosyaAdi, FileMode.Create);

    GZipStream ZipStream = new GZipStream(Input, CompressionMode.Decompress);

        

    try

    {

        int Data = ZipStream.ReadByte();

        while (Data > 0)

        {

            Output.WriteByte((byte)Data);

            Data = ZipStream.ReadByte();

        }

    }

    finally

    {

        Output.Close();

        Input.Close();

    }

}     

 

Yukarıdaki metod aşağıdaki gibi kullanılabilir.

Decompress("C:\\OnemliDosya.gz", "C:\\OnemliDosya.Yeni.txt")

FileStream ile okunan dosya sıkıştırılmış olduğundan yaratılan dosyanın tam boyutu bilinmemektedir. Dolayısıyla bu dosya FileStream ile  tam oluşturulamamaktadır. Bunun için bir döngü içinde dosyanın gerçek boyutu okunur. Daha sonra dosya FileStream ile okunur ve GZipStream de tanımlanan FileStream ile fiziksel olarak genişletilmiş olan dosya oluşturulur.