21 Nisan 2013 Pazar

GZipStream Sınıfı ile Dosya Sıkıştırma

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.

8 Nisan 2013 Pazartesi

Microsoft Teknolojilerini anlatan ücretsiz E-Book'lar

ASP.NET, Office, SQL Server, Windows Azure, SharePoint Server ve diğer Microsoft teknolojilerini anlatan ücretsiz e-book'lara aşağıdaki linkten ulaşabilirsiniz. Yani kitaplar çıktıkça burada yayınlanmaya devam edecek.

http://social.technet.microsoft.com/wiki/contents/articles/11608.e-book-gallery-for-microsoft-technologies.aspx

3 Nisan 2013 Çarşamba

Entity Framework GroupBy Kullanımı


SORU:
Aşağıdaki SQL sorgusunu Entity Framework kullanarak uygulamak istiyorum, yardımcı olabilir misiniz?

SELECT SehirAd, Count(SehirAd) FROM Uye GROUP BY SehirAd

CEVAP:
Öncelikle, Şehir bilgilerini ayrı bir şehir tablosunda tutmak daha doğru olacaktır. Vermiş olduğunuz sorguyu aşağıdaki yollardan biri ile kullanabilirsiniz.

var sorgu = from u in ctx.Uyes group u by u.SehirAd into g select new { SehirAdi = g.Key, UyeAdedi = g.Count() };

veya

var sorgu = ctx.Uyes.GroupBy(u => u.SehirAd).Select(g => new { SehirAdi = g.Key, UyeAdedi = g.Count() });

Windows Blue Sürüm Numarası


Windows 8 adıyla bilinen son Windows'un sürüm numarası 6.2 idi. Ağustos 2013'te yayınlanması beklenen Blue adı ile anılan gelecek Windows'un ise 6.3 sürüm numarasına sahip olması bekleniyor. Windows Blue, Windows 8 serisine ait bir güncelleme olacak.

Windows RT tarafındaki Blue güncellemesi ise Windows RT 8.1 adını alacak. Bu yeni güncellemenin ücretli olacağına dair herhangi bir bilgi bulunmuyor.

Blue güncellemesinin resmi adı Windows 8.1 mi olacak?

Windows 8 Blue (Windows 8.1)
Windows Blue güncellemesi için zaman yaklaşmaya devam ediyor. Bu güncelleme Windows 8.1 adını taşıyarak kullanıcılarla buluşacak.


Bu güncelleme, service packler ile görmeye alışık olmadığımız bir takım işletim sistemi iyileştirmeleri içerecek. Windows 8.1 ile birlikte, işletim sistemi güncellemeleri ve yükseltmeleri için yeni bir yaklaşım izlenmeye başlayacak. Güncellemelerin artık yıllık olarak gerçekleşeceğini söyleyebiliriz.

Windows 8.1'in halka açık ilk önizleme sürümünün Haziran ayındaki Build Konferansı'nda yayınlanması bekleniyor.