Bu makalemizde .Net Compact Framework 3.5 ile mobil cihaz
uygulama geliştiricilerin kullanımına sunulan ve mobil cihaz uygulamalarında
sıkıştırma işlemlerine olanak sağlayan System.IO.Compression namespace’ i
içerisindeki sınıfları inceleyecek, örnek bir uygulama geliştiriceğiz.
Bilgisayarların tüm gelişim tarihi boyunca farklı ihtiyaçlar
üzerinde birçok metodoloji geliştirilmiş ve tüm bu metodolojiler zamanla
standart bilgisayar hayatımıza girmiş bulunmaktadır. İnsanoğlunun bu gelişim
sürecinde üzerinde çalıştığı en önemli nokta ise temel olarak byte dizileri
olarak adlandırılan veri kümelerini bilgisayar ortamında daha efektif ve daha
iyi nasıl depolanacağıdır. Bu noktada araştırıldığında ise zaman içerisinde bu
veri kümelerinin taşınılabilirlilik ve depolama noktasında hayatımızı
kolaylaştırabilmesi açısından birçok çalışma gerçekleştirilmiş ve bugün
birçoğumuzun günlük hayatında farkında olmadan yüzlerce kez kullandığımız
yöntemlere dönüşmüştür.
Bu metodolojilerin en başında hepinizin tahmin edebileceği
üzere sıkıştırma (zip / unzip) işlemleri gelmektedir. Sıkıştırma mantığına
temel olarak bakıldığında böyle bir işlemin gerçekleştirilebilmesi için gereken
yazılım kodlanabilmesi için çok yüksek bir matematik bilgisine ve bu matematik
bilgisini yazılımsal olarak destekleyebilecek programlama bilgisine sahip
olunması gerektiği kolay bir şekilde anlaşılabilmektedir. Sıkıştırma işlemleri
tüm gelişim tarihi boyunca çok önemli bir yer kaplamış, farklı algoritmalar
üzerinden bugünkü standart olarak kabul edilebilecek ve günlük hayatta yüzlerce
kez kullandığımız / kullanıyor olduğumuz halini almıştır. Bugün
araştırıldığında en meşhur ve en çok kullanılan sıkıştırma uygulamalarının arka
tarafında tarihteki en meşhur sıkıştırma algoritmalarından Deflate Algoritması
kullanılmaktadır. Deflate algoritması ile ilgili ayrıntılı bilgiye http://en.wikipedia.org/wiki/DEFLATE_(algorithm)
adresinden ulaşabilir, bu algoritmanın arka tarafındaki matematiksel altyapıyı
öğrenebilirsiniz.
Bu makalemizde ise bu algoritmaları kullanan sınıfların
hazır olarak tanımlandığı System.IO.Compression namespace’ i içerisindeki
sınıfları kullanarak mobil cihaz uygulamalarında sıkıştırma işlemlerinin nasıl
gerçekleştirilebileceği ile ilgili konuyu ifade edecek ve örnek bir uygulama
geliştirilecektir.
Hızlı bir şekilde .Net Compact Framework 3.5 ile mobil cihaz
uygulamalarında hayatımıza giren sınıfları tanımaya geçelim.
Öncelikle belirtmemiz gerekirki bu sınıfları masaüstü .net
Framework uygulama geliştiricileri .net Framework 2.0 sürümünden beri
kullanmakta, kendi uygulamalarında Deflate algoritması üzerinden sıkıştırma
işlemleri gerçekleştirebilmektedirler. Biz ise bugün .net Compact Framework 3.5
ile mobil cihaz uygulama geliştiricilerinde hayatına giren bu sınıflarla mobil
cihaz üzerinde çalışan ve zip / unzip işlemleri gerçekleştirebileceğimiz bir
uygulama geliştireceğiz.
Üstteki resimden de anlaşılabileceği üzere System.IO.Compression
içerisinde aslında birbiriyle küçük bir
fark dışında tamamen aynı iki adet sınıf bulunmaktadır.
DeflateStream adından da anlaşılabileceği üzere Deflate
algoritmasını kullanarak sıkıştırma ve açma işlemi gerçekleştirmeye yarayan
altyapıyı içerisinde barındırmaktadır. GzipStream ise yine Deflate
algoritmasını kullanmaktadır, fakat içerisine Gzip dosya formatına uygun bazı
başlık bilgileri eklemekte, dolayısıyla gzip uzantısına sahip dosyaları
açabilecek tüm uygulamalarda açabilecek hale getirmektedir.
Hiç vakit kaybetmeden Visual Studio 2008 üzerinde bir mobil
cihaz uygulaması açarak işe başlayalım. Bu noktada belirtmemiz gerekise
geliştirilecek olan uygulamanın hedef platformu Windows Mobile 6.0 yüklü
dokunmatik özelliğe sahip (Windows Mobile 6.0 Professional) cihazlar olduğundan
dolayı ilgili SDK’ yı sisteminize kurmanız gerekmektedir. İlgili SDK ‘ yı http://www.microsoft.com/downloads/details.aspx?familyid=06111A3A-A651-4745-88EF-3D48091A390B&displaylang=en
adresinden indirebilirsiniz. Visual Studio üzerinde bir mobil cihaz uygulaması
oluşturarak hızlı bir şekilde örnek projemizi geliştirmeye başlayalım.
Projemizin adı MobiZip.
Hedef platformumuz ise Windows Mobile Professional 6 SDK
üzerinde .Net Compact Framework 3.5 sürümü olacaktır.
Uygulama ekranını tasarlamaya geçmeden önce hızlı bir
şekilde uygulamamızın senaryosunu ifade edelim.
Uygulamanın temel amacı mobil cihaz üzerinde
konumlandırılmış bir dosyayı sıkıştırmak ya da belirli koşullar sağlandığı
taktirde bu sıkıştırılan dosyayı açıp tekrardan eski haline getirmektir. Bu
noktada bu koşulları ifade etmemiz gerekirse ;
Uygulamamızın kullanacak olduğu dosya uzantısı DosyaAdi.mobizip
olacaktır. DeflateStream yapısı gereği dosyanın sıkıştırılmadan önceki adı ve
boyut bilgisini tutmadığından ve dosyanın eski haline getirilmesi noktasında bu
bilgilere ihtiyaç duyulacağından sıkıştırılmış dosyanın yanına uzantısı DosyaAdi.mobizip.info
olan bir bilgi dosyası daha oluşturulacaktır. Bu dosya içerisinde arasında |
işareti koyularak dosyanın orjinal adı ve sıkıştırılmadan önceki boyutu
kaydedilecektir.
Hızlı bir şekilde uygulama ekranını tasarlayalım.
Uygulama ekranına baktığımızda çokta karmaşık bir arayüz
olmadığını, ihtiyaçlar noktasında sıkıştırma yada açma işlemi
gerçekleştirilecek olan dosyanın seçilebilmesi için gereken 3-4 adet kontrol
yerleştirilmiştir. Ayrıca ekran üzerinde görünmeyen ve dosya seçme diyaloğunu temsil
eden OpenFileDialog kontrolüde arayüz üzerine yerleştirilmitir. (OfdSelectFile)
Hızlı bir şekilde kod altyapısını oluşturmamız gerekirse ;
Senaryo gereği kullanıcı OpenFileDialog vasıtasıyla
sıkıştırılacak yada açma işlemi gerçekleştirilecek dosyayı seçecektir.
... yazan button’ a tıkladığımızda aşağıdaki kod bloğu
çalıştırılacaktır.
Yukarıdaki kod bloğundan anlaşılabileceği üzer dosya seçme
ekranı üzerinden herhangi bir dosya seçildiğinde bu dosya bilgisi metin kutusu
içerisine yazdırılmaktadır.
Bir sonraki aşamada sıkıştırma işlemlerinde kullanacak
olduğumuz 3 adet stream obje referansını global’ e yerleştiriyoruz.
Bu noktada açıklamamız gerekirse ; DeflateStream adından da
anlaşılabileceği üzere sıkıştırma ya da açma işlemlerini gerçekleştirecek olan
Stream objesini temsil etmektedir. FsSource senaryoya göre o an işleme sokulan
dosyanın stream’ i FsTarget ise o an senaryoya göre işlem görecek olan dosyanın
stream’ ini temsil etmektedir.
Sıra geldi sıkıştırma / açma işlemlerini gerçekleştirecek
olan Operate button’ una tıklandığında çalıştırılacak olan kod bloğunu
hazırlamaya geldi.
Uygulamamız hangi işlemin yapılacağına (sıkıştırma / açma)
seçilen dosyanın türüne bakarak karar verecektir. Eğer seçilen dosyanın
uzantısı *.mobizip ise açma, değilse sıkıştırma işlemi gerçekleştirecektir.
Aynı zamanda *.mobizip uzantısına sahip olsa bile dosyanın eski haline
getirilebilmesi için gereken *.mobizip.info dosyasınıda sıkıştırılmış dosyanın
yanında arayacak şayet bulabilirse hata vermeden işlemi tamamlayacaktır.
Operate tuşuna basıldığında ilk olarak dosyanın türünü
inceliyoruz ;
Bu if koşulunun else ayağında ise sıkıştırma işlemi
gerçekleştirilmektedir.
Hızlı bir şekilde uygulamamıza devam edelim. Eğer seçilen
dosya mobizip uzantısına sahip ise açma işleminin yapılacağı ile ilgili kod
bloğu çalıştırılmaktadır. Bu kod bloğunda ise ilk olarak ilgili dosyanın
bilgilerinin bulunduğu info dosyası aranmaktadır.
Dosya eğer başarılı bir şekilde bulunabilmiş ise dosya
içeriği | işaretine göre split edilmekte ve bir diziye aktarılmaktadır.
Bir sonraki aşamada açma işlemi için gereken kodlar
yazılmaktadır.
Yazılan kodları sırasıyla incelediğimizde ilk olarak global’
de tanımlanan Stream objelerinin instance’ ları oluşturulmakta ; FsSource açılacak
olan dosyayı temsil etmekte, FsTarget ise açıldıktan sonra oluşturulacak olan eski
dosyayı temsil etmektedir.
DeflateStream objesinin instance’ ının oluşturulduğu satırda
ise ilk parametresinde açılacak olan stream’ a referans, ikinci parametresinde
ise gerçekleştirilecek olan işlem seçilmiştir.
Bir sonraki satırda info dosyasının yardımıyla dosyanın
açıldıktan sonraki halinin byte dizisini depolayabilecek bir buffer
oluşturulmuş, boyut olarakta yine info dosyasının yardımıyla eski dosyanın
(sıkıştırılmadan önceki) boyutu atanmıştır.
ds.Read ile başlayan satırda sıkıştırılmış dosyanın tekrardan açılmış hali buffer ‘ a
kopyalanmakta,bir sonraki satırda ise buffer içerisindeki açılmış hali FsTarget
stream’ i üzerinden yeni oluşturulmuş ve açılmış olan dosyaya yazılmaktadır.
İşte bu kadar ! Bu noktadaki en önemli uyarı ise stream’ leri kullandıktan
sonra kesin olarak kapatmanızdır. Aksi taktirde dosyalara erişim kısıtlanacak
ve hata alınacaktır.
Bir diğer çalıştırılacak olan kod bloğu ise sıkıştırma
işlemi için gereken kod bloğudur. Uygulama uzantının *.mobizip olmadığı
durumlarda sıkıştırma işlemi gerçekleştirmekte ; bununla birlikte bir info
dosyası oluşturmaktadır.
Yukarıdaki kod bloğu incelendiğinde ise aslında bir önceki
işlemle karşılaştırıldığında tam ters hareket uygulanmaktadır.
İlk iki satırda sıkıştırılmış ve sıkıştırılacak olan
dosyalar ilgili stream’ lere yüklenmekte, bir sonraki aşamada ise dosya
bilgilerinin tutulduğu FileInfo değişkeni oluşturulmaktadır.
Daha sonra sıkıştırılacak olan dosyanın verileri Buffer’ a
yüklenmekte, ve DeflateStream üzerinden FsTarget isimli stream’ e bu veriler sıkıştırılarak gönderilmektedir.
Bu işlemden sonra *.mobizip.info uzantılı dosya da
kaydedilmekte ve işlem tamamlanmaktadır. İsterseniz hiç vakit kaybetmeden uygulamamızı
Emulator üzerinde deneyelim.
Uygulamamızı çalıştırdığımızda aşağıdaki görüntüyü elde
etmemiz gerekmektedir.
Dosya seçme ekranını açarak daha önceden cihaza
kopyaladığımız ve sıkıştırılmaya çok müsait olan bir BMP dosyasını seçiyoruz.
Ve son görünüm,
Operate tuşuna tıkladığımızda uygulama dosyanın uzantısına
bakacak ve sıkıştırma işlemi gerçekleştirecektir.
Dosyanın bulunduğu yere gidip baktığımızda dosyanın yanında
2 adet daha dosya görmekteyiz. Bunlardan biri sıkıştırılmış olan dosya (*.mobizip)
ve sıkıştırılan dosyanın eski boyut bilgisi ve isim bilgisini tutan
*.mobizip.info dosyası.
Dikkat edilecek olursa dosya boyutu neredeyse 20 kat
küçülmüştür.
Bir sonraki aşamada OrnekBMP isimli bmp dosyasını siliyoruz.
Ve bu dosyayı sıkıştırıldığı halinden tekrar oluşturuyoruz.
Öncelikle uygulamamızdan mobizip uzantılı sıkıştırılmış
dosyayı seçiyoruz.
Operate tuşuna bastığımda ise açma işlemi başarıyla
gerçekleştirilmektedir ;
Dosyanın bulunduğu yere tekrar gidip baktığımızda ;
Dosyanın tekrar oluşturulmuş olduğunu görmekteyiz.
İşte bu kadar !
Bu makalede .net Compact Framework 3.5 ile birlikte gelen
System.IO.Compression sınıflarını kullanarak bir sıkıştırma / açma işleminin
nasıl gerçekleştirilebileceği ile ilgili örnek bir uygulama geliştirdik.
Başka bir makalede daha görüşmek dileğiyle.
Ekin Özçiçekçiler
Device Application
Development MVP