Derste yaptığımız basit bir örnek ve proje üzerine aldığımız notları aşağıda bulabilirsiniz. Daha önce vermiş olduğum örnek kodlara da buradan ulaşabilirsiniz.
//GZipStream sınıfını kullanarak dosya sıkıştırma işlemi gerçekleştireceğiz. Bu sınıf, System.IO.Compression isimalanında yer alıyor. Öncelikle using direktiflerimiz arasına aşağıdaki satırı ekleyerek başlayalım.
//using System.IO.Compression;
//Sıkıştırma işlemi sırasında kullanmak üzere iki ayrı FileStream nesnesine ihtiyacımız olacak. İlk nesne ile sıkıştırmak istediğimiz orjinal dosyayı okurken, ikinci nesne ile sıkıştırılmış bilgileri diğer dosyaya yazacağız. Öncelikle, FileStream sınıfını içerisinde barındıran System.IO isimalanını using direktiflerimiz arasına ekleyelim. Ardından da, aşağıdaki kodlarla bu iki nesneyi örnekleyelim.
FileStream okuma = new FileStream("Duke.bmp", FileMode.Open);
FileStream yazma = new FileStream("Duke.gzip", FileMode.Create);
//Sıkıştırma işlemi için verileri byte[] cinsinden ele alacağız. Bu sebeple, ilk olarak okunacak dosya ile aynı boyutta bir byte dizisi oluşturalım. Boyut bilgisini, okuma isimli değişken ile işaret ettiğimiz nesnenin Length özelliğinden elde edebiliriz.
byte[] data = new byte[okuma.Length];
//Şimdi ise okuma işlemini yaparak, data'yı dolduracağız. Bu iş için FileStream sınıfının Read isimli metodunu kullanıyoruz.
okuma.Read(data, 0, data.Length);
// Read metoduna 3 parametre veriyoruz. İlki, veriyi nereye okuyacağımız, yani nereyi dolduracağımız bilgisi, ikinci bilgi işleme hangi byte'tan başlayacağımız bilgisi ve son olarak üçüncü bilgi ne kadarlık boyutta veri okuyacağımız bilgisi. Verileri data içerisine dolduracağız ve baştan başlayarak bu işi yapacağımız için o değerini kullanıyoruz. Ayrıca, dosyanın tamamını okuyacağımız için, data boyutu kadar okuma yapacağımızı belirttik. Hatırlarsanız, data'yı oluştururken, okunacak dosya ile aynı boyutta oluşturmuştuk.
okuma.Close();
// Verileri okuduktan sonra, dosya ile işimiz bittiğinden dolayı, dosyaya açılmış olan stream'i kapatıyoruz.
// Artık, GZipStream nesnesi ile sıkıştırma işlemine hazırız. Öncelikle, bir GZipStream nesnesi örnekleyelim. Örnekleme sırasında üç bilgi vereceğiz. Bunlardan ilki, sıkıştırılmış verinin hangi stream üzerine yazılacağı. Bu iş için yukarıdaki satırlarda tanımlamış olduğumuz yazma değişkeni ile işaret edilen nesneyi kullanacağız. İkinci bilgi olarak CompressionMode tanımlayacağız. Compress ya da Decompress olarak iki seçenek mevcut. Sıkıştırma işlemi için Compress, sıkıştırılmış bir veriyi açmak için Decompress seçeneği kullanılır. Üçüncü parametre ise, stream'i açık bırakmak isteyip istemediğimiz. Burada true değerini vererek stream'i açık bırakıyorum ve daha sonraki satırlarda Close metodu ile bilinçli bir şekilde kapatmayı planlıyorum.
GZipStream zip = new GZipStream(yazma, CompressionMode.Compress, true);
// GZipStream nesnemizi işaret eden zip değişkeni üzerinden Write metodunu çağırarak, yazma işleminde kullanılacak kaynağı, yazmaya nereden başlayacağını ve ne boyutta bir veri yazılacağını veriyoruz.
zip.Write(data, 0, data.Length);
//Bu işlemin ardından, Duke.gzip dosyası, sıkıştırılmış veriler ile doldurulacak. İşimiz bittiğinde, hem GZipStream hem de yazma amaçlı kullandığımız FileStream nesnelerimizi kapatmayı unutmuyoruz.
zip.Close();
yazma.Close();
// Bu örneği geliştimek adına, OpenFileDialog ve SaveFileDialog kullanarak basit bir WinForms uygulaması geliştirebilirsiniz.
// Şimdi, sıkıştırdığımız bu dosyayı geri açmak için gerekli kodları inceleyeceğiz. Yapacağımız işleri, ilk aşamada uyguladıklarımızın tam tersi olarak yorumlayabiliriz. Fakat, burada en önemli nokta, dosyayı açtığımızda, ne kadar yer kaplayacağını önceden bilmediğimiz için, ilk olarak bu değeri tespit etmeliyiz.
FileStream stream = new FileStream("Duke.gzip", FileMode.Open, FileAccess.Read);
GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress);
int boyut = 0;
byte[] buffer = new byte[200];
while (true)
{
int okunan = zipStream.Read(buffer, 0, 200);
if (okunan == 0)
{
break;
}
boyut += okunan;
}
zipStream.Close();
stream.Close();
// Yukarıdaki kodlar, sıkıştırılmış dosyanın, açılmış halini 200 byte'lık parçalar halinde okur ve okuyabildiği sürece boyut değişkeninin değerini artırır. İşlem tamamlandığında, artık boyut değişkeni bize açılmış dosyanın kaplayacağı alanı söyleyecektir. Elimizde bu bilgi ile, aşağıdaki kodları yazabilir ve açılmış dosyayı diske kaydedebiliriz.
FileStream fsr = new FileStream("Duke.gzip", FileMode.Open, FileAccess.Read, FileShare.Read);
GZipStream gzs = new GZipStream(fsr, CompressionMode.Decompress);
byte[] acilanData = new byte[boyut];
FileStream fsw = new FileStream("DukeAcilan.bmp", FileMode.CreateNew);
gzs.Read(acilanData, 0, boyut);
fsw.Write(acilanData, 0, acilanData.Length);
fsr.Close();
gzs.Close();
fsw.Close();
// GZipStream ile çalışırken CompressionLevel olarak NoCompression, Fastest ya da Optimal değerleri kullanılabilir.
Hiç yorum yok:
Yorum Gönder