Makale Özeti

Makale C# 2.0 İle System.IO.Compressing namespace'i kullanarak Dosya Sıkıştırma İşlemlerinin nasıl yapılacağını anlatmaktadır.

Makale

         Mehabalar,

         Bu makalemde sizlerle birlikte C# 2.0 ile gelen yeni özelliklerden biri olan File Compressing (Dosya sıkıştırma) işleminin System.IO.Compression namespace'inin kullanılarak nasıl yapılacağını inceleyeceğiz.

         System.IO.Compression namespace'i altında iki çeşit sıkıştırma algoritmasını barındıran class mevcuttur. Bunlardan biri Deflate metodunu bize sunan class iken diğeri ve bu makalede inceleyeceğimiz GZip metodudur. Tüm IO işlemlerinde olduğu gibi sıkıştırma işlemleri stream üzerinden yapılmaktadır ve bu sıkıştırma algoritmalarına uyumlu şekilde yazılmış stream classları mevcuttur.

         Sıkıştırma metodlarını kullanabileceğimiz durumları ve yerleri saycak olursak başlıca veri transferi sırasında ağ trafiği oluşmasındansa işlemci maliyeti oluşmasının tercih edilebileceği durumlar (Örneğin Ağ üzerinden datanın yüksek boyutta dosyalar ile gönderilmesi gibi) sayılabilir.

          Şimdi ise bir örnek ile ilkönce seçtiğimiz bir dosyayı sıkıştırıp daha sonra ise Seçtiğimiz sıkıştırılmış dosyayı geri açalım.

         

private void btnZiple_Click(object sender, EventArgs e)

            {

                  ofd.ShowDialog();

                  sfd.ShowDialog();

                  FileStream insOutputFileStream = new FileStream(sfd.FileName,FileMode.Create);           

                  GZipStream zipStream = new GZipStream(insOutputFileStream, CompressionMode.Compress,true);

                  FileStream insInputFileStream = new FileStream(ofd.FileName,FileMode.Open);

                  byte[] buffer = new byte[insInputFileStream.Length];

                  int count = insInputFileStream.Read(buffer, 0, buffer.Length);

                  insInputFileStream.Close();

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

                  zipStream.Close();

                  insOutputFileStream.Close();

            }

       
         Bu metodumuzda ilk önce kullanıcıya sıkıştırmak istediği dosyayı seçmesi için bir OpenFileDialog penceresi gösteriyoruz. Daha Sonrasında ise sıkıştırılmış dosyanın nereye hangi isimle kaydedileceği bilgisini SaveFileDialog penceresi ile alıyoruz. Bundan sonraki işlem ise kullanıcının sıkıştırmak istediği dosyayı sıkışmış halde yazabilmek için bir FileStream tanımlayarak dosyanın içeriğini yazabilmeye olanak sağlamak olacaktır. Daha sonraki satırda ise bir GZipStream tanımlayarak bu stream içinde sıkıştırılma  işlemi yapılacağını ve sıkıştırma sonucu meydana gelecek Streamin ise biraz önce oluşturduğumuz FileStreame atılacağını belirliyoruz. Daha sonrasında ise yine bir FileStream aracılığı ile sıkıştırmak istediğimiz dosyayı okuyarak bunu ZipStream içine yazmak suretiyle ZipStream için tanımlamış olduğuuz FileStream ile sıkıştırılmış dosyamızın kaydedilmesini sağladıktan sonra Streamlerimizi kapatıyoruz.
 

private void btnZipAc_Click(object sender, EventArgs e)

            {

                  ofd.ShowDialog();

                  sfd.ShowDialog();

                  FileStream insInputFileStream = new FileStream(ofd.FileName,FileMode.Open, FileAccess.Read,FileShare.Read);

                  GZipStream insGZipStream = new GZipStream(insInputFileStream,CompressionMode.Decompress);

                  int offset = 0;

                  int totalBytes = 0;

                  byte[] smallBuffer = new byte[100];

                  while (true)

                  {

                        int bytesRead = insGZipStream.Read(smallBuffer, 0, 100);

                        if (bytesRead == 0)

                        {

                              break;

                        }

                        offset += bytesRead;

                        totalBytes += bytesRead;

                  }

                  insGZipStream.Close();

                  insInputFileStream = new FileStream(ofd.FileName,FileMode.Open, FileAccess.Read,FileShare.Read);

                  insGZipStream = new GZipStream(insInputFileStream,CompressionMode.Decompress);

                  byte[] buffer = new byte[totalBytes];

                  insGZipStream.Read(buffer, 0, totalBytes);

                  FileStream insOputPutFileStream = new FileStream(sfd.FileName, FileMode.CreateNew);

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

                  insOputPutFileStream.Close();

                  insGZipStream.Close();

                  insInputFileStream.Close();

            }

 
         Sıkıştırılmış dosyaları açmamıza yarayan bu metodda ise kullanıcıdan sıkıştırılmış dosyayı seçmesini ve sıkıştırılmış dosyanın içeriğinin açılacağı dosyayı seçmesini OpenFileDialog ve SaveFileDialog ile istiyoruz.Ancak burada FıleStream ile okumuş olduğumuz dosya sıkıştırılmış olduğundan yaratacağımız dosyanın tam boyutunu vermemkte ve dolayısıyla biz bu dosyayı FileStream ile tam oluşturamamaktayız.Bunun icin bir while döngüsü içinde dosyanın gerçek boyutunu okuyoruz ve daha sonrasında dosyayı FileStream ile okuyup GZipStream de tanımladığımız FileStream ile fiziksel olarak sıkıştırılması açılmış olan dosyayı oluşturuyoruz.

         Bu makalede yapılan uygulama makale için tamamlayıcı örnek teşkil ettiğinden hata yakalama fonksiyonları ve kod optimizasyonu yapılmamıştır. Bu makale ile ilgili her türlü sorunuz için bana oztamer@hotmail.com adresinden ulaşabilirsiniz.

Ornek Uygulama