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 :)