C# SharpZipLib örneği

Merhabalar,

GeçtiÄŸimiz dönemde, var olan Attachment’ları “zip” ile sıkıştırıp kullanıcıya download ettirme gibi bir özellik istendi. Hani bir benzeri ‘google’ da var ya iÅŸte o :). Güzel bir özellik ama hepsi google’ın suçu rahat rahat yaymak varken, oturduk bununla uÄŸraÅŸtık.

Ãœstelik .NET 2.0’da gelen sınıfın birden fazla dosyayı aynı output dosyası içerisinde birleÅŸtirme gibi bir özelliÄŸi olmadığını öğrenince daha bi moralim bozuldu ama yapacak birÅŸey yok iÅŸ iÅŸtir :). Diyerek SharpZipLib adlı ‘Open Source’ bir kütüphane buldum. Aslına bakılırsa bayağı ünlü ve kullanılan bir kütüphaneymiÅŸ, üstelik iyi bir iÅŸ çıkarmışlar. Fakat bununla beraber hafızada hali hazırda yer alan stream’leri kullanan adam gibi örnek de bulamadım. Ä°yice uyuz oldum kısaca :). Ben uyuz oldum siz olmayın diye de bu yazıyı yazmaya karar verdim. Ä°yi etmiÅŸ miyim :)

[csharp]
MemoryStream outStream = null;
try
{
outStream = new MemoryStream(); // OluÅŸturulacak output dosya memory’e yazılacağı için MemoryStream oluÅŸturulur.
using (ZipOutputStream s = new ZipOutputStream(outStream)) // Bu outStream’e yazılacak olan ZipOutputStream oluÅŸturulur.
{
s.SetLevel(0); // 0..9’a kadar deÄŸer alır, 0: Sadece aynı dosyaya koyma, 9: Yüksek seviyeli sıkıştırma

for (MyFile myFile in myFiles)
{
// Yeni bir Zip dosya parçası yaratılır.
ZipEntry entry = new ZipEntry(myFile.FileName);
entry.DateTime = myFile.UploadDt;
entry.Size = myFile.Size;
s.PutNextEntry(entry); // Yaratılan bu Zip dosya parçası, ‘s’ adlı output nesnesine verilir.

byte[] content = myFile.Content; // Content’ dosyanın byte’larının yer aldığı diziyi saklayan property’dir.
s.Write(content, 0, content.Length); // Dosya’dan okunan content bilgisi zip output stream’e yazılır.
}
s.Finish(); // Her zip output stream kapatılmak zorundadır. CRC kontrollerinde hata verebilir(miş).

s.Close(); // Kendisine constructor’da parametre olarak geçilen Stream üzerindeki lock’ı kaldırması için kullanılır.
}
// outStream.ToArray(); ile byte[] elde edilebilir ve istenildiği gibi kullanıcıya download ettirilebilir.
}
finally // Her durumda memory’de yer alan outStream’i kapatması istenir.
{
if (outStream != null)
outStream.Close();
}
[/csharp]

Görüldüğü gibi memory’de bu iÅŸlemleri yapmak son derece basit. EÄŸer bir dosyadan okuma ile bu iÅŸlemi yapacaksanız “buffer” mekanizmasını kullanmanızı yani, dosyayı küçük küçük parçalarla outputStream’e yazmanızı tavsiye ederim. Bu iÅŸlemde bu modeli kullanmamamın nedeni, zaten hafızada olan bir nesnenin küçük parçalar taşınmasının mantıksızlığından ötürüdür.

Kolay gelsin :)

C# SharpZipLib örneÄŸi” üzerine bir yorum

  1. Selam hocam, çok güzel bi örnek olmuÅŸ. Ufak bi sorum olacak ; Åžifreli sıkıştırma nasıl olacak. Property’lere baktım password gibi özellikler vardı ama yapamadım. Bilginiz varsa bilgilendirirseniz sevinirim. Şİmdiden teÅŸekkürler.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir