<Mayıs>
PSÇPCCP
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
Kayıt Ol

. .Net Framework
. ADO.Net
. ASP.Net, Web Servisleri
. C#, Visual C#
. Delphi.Net
. Diğer
. Mobil.Net
. NetFx
. VB.Net
. Veritabanları
. Visual Studio
. XML

. .Net Framework
. ADO.Net
. ASP.Net, Web Servisleri
. C#, Visual C#
. Delphi.Net
. Diğer
. Mobil.Net
. NetFx
. VB.Net
. Veritabanları
. Visual Studio
. XML

 
 
 
GZip İle Dosya Sıkıştırma 
Yazar: Ömer Faruk Özsakarya  - Yazara ait tüm yazılar
Ders Özeti: Merhabalar, bu yazımda .Net Framework 2.0 ile beraber gelmiş olan GzipStream sınıfına kısaca değineceğim. gzip gnu'nun sıkıştırma programıdır. UNIX’te .gz, VMS’te -gz, MSDOS’da, OS/2’te .z uzantılı dosyalard... 
Okunma: 1900
MaxiPuan: 299
Yazı Kategorisi: .Net Framework

Ardaşına Tavsiye Et - Yazdırılabilir Biçim



Bu alana reklam verebilirsiniz

Gzip

Merhabalar, bu yazımda .Net Framework 2.0 ile beraber gelmiş olan GzipStream sınıfına kısaca değineceğim. gzip gnu'nun sıkıştırma programıdır. UNIX’te .gz, VMS’te -gz, MSDOS’da, OS/2’te .z uzantılı dosyalardır. (http://www.po.metu.edu.tr/links/inf/css25/bolum12.html#4.4) GZip ifadesi "Gnu Zip" kelimesinin kısaltılmışıdır. Gzip in temelinde ise deflate isimli sıkıştırma algoritması vardır.

Bu sınıf akım(diğer adıyla stream)ları sıkıştırmak ve sıkıştırılmış akışları geri açmak için metotlar ve özellikler sağlıyor. DeflateStream sınıfıyla beraber System.IO.Compression isim alanında bulunuyor.

GzipStream sınıfı System.IO isim alanında bulunan Stream sınıfından türetilmiştir, yani sınıfımızı :

public class GzipStream : Stream

şeklinde gösterebiliriz.

gzip veri formatımız DeflateStream sınıfıyla aynı algoritmayı kullanır fakat diğer sıkıştırma metotlarını kullanabilmek için türetme yapabiliriz. Fakat gzip algortimasını 4 GB’den büyük dosyalar için kullanamayız.

DeflateStream ve GzipStream sınıflarının sıkıştırma fonksiyonları stream açığa çıkarır. Veri byte byte okunur. MSDN’de belirtildiğine göre bu sınıflar sıkıştırılmamış dosyalar için en iyidir fakat veri kaynağı önceden sıkıştırıldıysa boyut daha da artabilir.

Eğer GzipStream sınıfından türetme yapmak isterseniz CanSeek ,CanWrite ve CanRead üyelerini override etmelisiniz.

GzipStream sınıfının 2 tane yapıcı metodu vardır.

1-) GzipStream (Stream , CompressionMode)

2-) GzipStream (Stream , CompressionMode , boolean )

Birinici yapıcı metotta belirtilen stream ve compressionmode a göre GzipStream nesnesi oluşturulur. Burada CompressionMode bir enum sabitidir. Belirtilen streamin sıkıştırılacağını mı yoksa sıkıştırılmış streamin açılacağını mı belirtir. 2 değer alır. Birisi CompressionMode.Compress diğeri ise CompressionMode.Decompress'tir.

Msdn'den bu sınıfa ait tüm metotları inceleyebilirsiniz. Bu yazımda sadece kısaca read ve write metotlarından bahsedeceğim.

Read Metodu: public override int Read(byte[] dizi,int ofset,int adet )

Bu metot adet kadar decompressed(sıkıştırıldıktan sonra geri açılmış) byte'ı byte türden diziye atar.

Write Metodu: public override void write ( byte[] dizi,int ofset,int sayac)

Bu metot ise dizideki ofsetinci byte'dan başlayarak sayac kadar sıkıştırılmış byte'ı stream nesnesine yazar.

Şimdi bir örnekle fonksiyonların kullanım şeklini inceleyelim. Örneğimiz aşağıdaki gibi bir Windows uygulamasından oluşmaktadır.

Proje Görünümü

private void button1_Click(object sender, EventArgs e)//Sıkıştır butonunun
{
       string dosya="ilkdosya.doc";
       if (File.Exists(dosya))
              GZipTest.GZipCompress(dosya);
}

private void button2_Click(object sender, EventArgs e)
{
       string dosya = "yenidosya.gz";
       if (File.Exists(dosya))
              GZipTest.GZipDecompress(dosya);
}

Sıkıştır butonuna tıklanınca ilkdosya.doc adındaki dosyayı sıkıştırır,sıkıştırılmış dosyaya yenidosya.gz adını verdim. Geri aç butonuna tıklayınca ise yenidosya.gz adındaki dosya geri açılır ve sondosya.doc isimli dosyaya geri açılmış içerik yazılır. Bu işlemler aşağıdaki GzipTest adındaki sınıftaki GzipCompress ve GZipDecompress metodları kullanılarak yapılıyor.

GZipTest Sınıfı :

public class GZipTest
{
     public static void GZipCompress(string dosya_adi)
     {
          FileStream infile;
          try
          {
               infile = new FileStream(dosya_adi, FileMode.Open, FileAccess.Read, FileShare.Read);
               byte[] buffer = new byte[infile.Length];
               int count = infile.Read(buffer, 0, buffer.Length);
               if (count != buffer.Length)
               {
                    infile.Close();
                    MessageBox.Show("Dosya okuma sırasında sorun oluştu. ");
                    return;
               }
               infile.Close();
               FileStream fss = new FileStream("yenidosya.gz", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
               GZipStream compressedzipStream = new GZipStream(fss, CompressionMode.Compress, true);
               compressedzipStream.Write(buffer, 0, buffer.Length);
               compressedzipStream.Close();
               fss.Close();
          }
          catch (Exception e)
          {
               MessageBox.Show("Error occured. "+e.Message);
          }
     }
     public static void GZipDecompress(string filename)
     {
          FileStream infile;
          try
          {
               infile = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
               byte[] buffer = new byte[infile.Length];
               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();
               FileStream fss = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
               GZipStream zipStream = new GZipStream(fss, CompressionMode.Decompress);
               ArrayList vektorum=new ArrayList();
               //*****************************************
               int ofset = 0, buyukluk = 0;
               while (true)
            {
               byte[] buffer2 = new byte[vektorum.Count+100];
               int okunanByteSayisi = zipStream.Read(buffer2, ofset, 100);
               for (int i = ofset; i < buffer2.Length; i++)
               {
                  vektorum.Insert(i,buffer2[i]);
               }

               if (okunanByteSayisi == 0)
               {
                  break;
               }
               ofset += okunanByteSayisi;
               buyukluk += okunanByteSayisi;
            }
               //*****************************************
               byte[] son=new byte[vektorum.Count];                                            

               vektorum.CopyTo(son);
               FileStream sonst = new FileStream("asd2.doc", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
               sonst.Write(son, 0, buyukluk );
               zipStream.Close();
          }
          catch (Exception e)
          {
               MessageBox.Show("Error occured. ");
          }
     }
}

GzipCompress altyordamında, ilk önce parametre olarak geçirilen dosya okunuyor ve dosyanın içeriği buffer adındaki byte türünden diziye atılıyor.

FileStream fss = new FileStream("yenidosya.gz", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
GZipStream compressedzipStream = new GZipStream(fss,CompressionMode.Compress, true);
compressedzipStream.Write(buffer, 0, buffer.Length);

Sonra yukarıdaki satırlarda compressedzipStream adında bir tane GZipStream nesnesi oluşturuluyor ,CompressionMode'u Compress olarak belirtilerek sıkıştırma işlemi yapılacağını belirtmiş oluyoruz ve ayrıca FileStream türündeki fss'yi ilk argüman olarak geçirdiğimize dikkat edin.

compressedzipStream.Write(buffer, 0, buffer.Length);

satırında ise bufferdaki bilgiler sıkıştırılarak streame yazılıyor yani sıkıştırılmış verileri fss adındaki stream nesnesi ile yenidosya.gz'ye yazmış olduk.

  GZipStream zipStream = new GZipStream(fss, CompressionMode.Decompress);
  ArrayList vektorum=new ArrayList();
   //*****************************************
   int ofset = 0, buyukluk = 0;
   while (true)
   {
             byte[] buffer2 = new byte[vektorum.Count+100];
             int okunanByteSayisi = zipStream.Read(buffer2, ofset, 100);
             for (int i = ofset; i < buffer2.Length; i++)
             {
                 vektorum.Insert(i,buffer2[i]);
             }

             if (okunanByteSayisi == 0)
             {
                break;
             }
             ofset += okunanByteSayisi;
             buyukluk += okunanByteSayisi;
    }
     //*****************************************
   byte[] son=new byte[vektorum.Count];
   vektorum.CopyTo(son);
   FileStream sonst = new FileStream("asd2.doc", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
   sonst.Write(son, 0, buyukluk );

Decompress metodunda ise bu sefer sıkıştırılmış olan streamden okuyacağımız için read metodunu kullanıyoruz. Fakat biz dosyanın açıldığında boyutunun ne kadar olacağını başlangıçta bilmiyoruz. Bunun için Decompress modda olan zipstream nesnemizi kullanarak dosyanın açılacak olan içeriğini döngü içine 100'er byte olarak okuyoruz. Her döngüde okuduğumuz byteları kaybetmemek için bir ArrayListin içine atıyoruz. Son olarak ise FileStream nesnesinin Write metodunda byte türünden bir dizi kullanmamız gerektiğinden bu ArrayList'imizin elemanlarını son adındaki diziye atıyoruz.

Bu kodu düzgün çalıştırabilmek için System.IO , System.IO.Compression ve System.Collections aduzaylarını formumuza eklememiz gerekiyor.

Kaynak :
http://www.devx.com
http://msdn.microsoft.com

 

Bu dersi değerlendirin

Bu içerik ile ilgili daha önce yapılmış yorumlar
Bu içerik ile ilgili yapılmış bir yorum yok,
ilk yorumu siz yapmak için aşağıdaki formu doldurunuz
Bu içerik hakkında yorum yazınız:

 

İsim:  
Email:  
Başlık:  
Yorum:  

 

anasayfa | dersler | örnek kodlar | forum | kaynaklar | dosyalar | biz kimiz ? | bir önerim var |  iletişim | hata bildir | reklam

MaxiASP.Net Rss Kaynağı:

Copyright 2002 - 2006 MaxiASP.Net (v 1.9) - Tüm Hakları Saklıdır.
 Alan Adı ve Bulundurma: Radore Hosting