LINQ ile Dosya Sisteminde Sorgulama Yapmak

Yazdığımız uygulamalarda dosya sisteminde arama yapmaya ihtiyaç duyabiliriz. Bu durumda genelde döngüler yazarız. Peki LINQ kullanamaz mıyız? Üzerinde biraz çalıştıktan ve araştırma yaptıktan sonra, aşağıdaki kodu elde ettim;

private IEnumerable<FileInfo> DosyaListesi(DirectoryInfo KokDizin, string Uzanti, string DosyaAdiParcasi) { foreach (var f in KokDizin.GetFiles().Where(Dosya => Dosya.Extension == Uzanti && Dosya.Name.Contains(DosyaAdiParcasi))) yield return f;

foreach (DirectoryInfo d in KokDizin.GetDirectories())
    foreach (var f in DosyaListesi(d, Uzanti, DosyaAdiParcasi))
        yield return f; }

Gördüğünüz gibi fonksiyon, parametre olarak aramaya başlanacak kök dizini, arama yapılacak dosyanın uzantısını ve dosya isminde bir parçayı alıyor, geriye FileInfo sınıfında liste döndürüyor.

İlk foreach döngüsünde kök dizinde parametre ile alınmış kriterlere göre arama yapılıyor ve yield anahtar kelimesi ile, bulunan her sonuç dönüş kümesine ekleniyor.

İkinci (ve üçüncü) foreach döngülerinde ise, recursive (kendini tekrarlamalı) olarak DosyaListesi() fonksiyonu kendi kendisini çağırarak, arama işlemini alt klasörlerde de yapıyor.

Dosyanın UTF8 Formatında Olduğunu Belirleme

BilgeAdam‘da bir öğrencimin sorusu üzerine, bir dosyanın UTF8 formatında olup olmadığını belirlemek için programatik yollar düşünmeye başlamıştım.

System.Text namespace’inde bulunan Encoding class‘ını incelerken şöyle bir yol buldum;

public static bool IsUtf8(string DosyaAdi) { using (var Dosya = File.Open(DosyaAdi, FileMode.Open)) { byte[] pre = Encoding.UTF8.GetPreamble(); var b = new byte[pre.Length]; Dosya.Read(b, 0, b.Length); return b.SequenceEqual(pre); } }

Sadece dosyanın UTF8 olduğunu kontrol etmek için biraz hantal bir yol gibi gözüküyor değil mi?

Daha iyi bir yöntem öneriniz varsa, yorumlarınızı bekliyorum.

Sql Server SET NOCOUNT komutu

Sql Server‘da her sorgu çalıştırdığımızda, sorgu sonucu, etkilenen satır sayısı ile birlikte, sorguyu çalıştıran uygulamaya geri gönderilir.

Bazı durumlarda bu bilgi işimize yarasa bile, genellikle kullanmayız.

Sql Server‘ın bu bilgiyi hesaplamasını ve uygulamaya geri göndermesini engelleyerek, çok ufakta olsa kazanç sağlayabiliriz.

Yapmamız gereken, sorgudan önce aşağıdaki komutu çalıştırmak olacaktır;

SET NOCOUNT ON

Sql Server sadece ilgili sorgu için, etkilenen satır sayısını hesaplama işlemini yapmayacaktır.

Birkaç Faydalı Extension Method

C# 3.0 ile gelen Extension Method desteğini çok kullanışlı bulduğum için, kendi uygulamalarımda kullanmaya çalışıyorum. Bu yazımda faydalı bulduğum birkaç Extension Method‘u toplamaya çalıştım.

Metni Encrypt - Decrypt Eden Extension Method

namespace ExtensionManager { public static class Extensions { public static string Encrypt(this string stringToEncrypt, string key) { if (string.IsNullOrEmpty(stringToEncrypt)) throw new ArgumentException(“Boş metin şifrelenemez”); if (string.IsNullOrEmpty(key)) throw new ArgumentException(“Şifreleme için anahtar vermelisiniz”);

        CspParameters cspp = new CspParameters();
        cspp.KeyContainerName = key;

        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
        rsa.PersistKeyInCsp = true;

        byte[] bytes = rsa.Encrypt(UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

        return BitConverter.ToString(bytes);
    }

    public static string Decrypt(this string stringToDecrypt, string key)
    {
        if (string.IsNullOrEmpty(stringToDecrypt))
            throw new ArgumentException("Beş metnin şifresi çözülemez");
        if (string.IsNullOrEmpty(key))
            throw new ArgumentException("Şifre çözme için anahtar vermelisiniz");
        string result = null;
        try
        {
            CspParameters cspp = new CspParameters();
            cspp.KeyContainerName = key;

            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
            rsa.PersistKeyInCsp = true;

            string[] decryptArray = stringToDecrypt.Split("-");
            byte[] decryptByteArray = Array.ConvertAll&lt;string, byte&gt;(decryptArray, (s =&gt; Convert.ToByte(byte.Parse(s, NumberStyles.HexNumber))));
            byte[] bytes = rsa.Decrypt(decryptByteArray, true);

            result = UTF8Encoding.UTF8.GetString(bytes);
        }
        catch()
        {
        }
        return result;
    }
} }</pre>

Örnek kullanım;

string metin = "My Secret";
string sifrelenmis = metin.Encrypt("sifreleyici");
string sifresicozulmus = sifrelenmis.Decrypt("sifreleyici");

Listeler üzerinde Foreach Yapan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static void ForEach<T>(this IEnumerable<T> kaynak, Action<T> islem)
        {
            foreach (var item in kaynak)
                islem(item);
        }
    }
}

Örnek kullanım;

List<string> isimler = new List<string> { "engin", "polat", "ahmet", "mehmet", "murat" };
isimler.ForEach(isim => MessageBox.Show(isim));

İnternet Adresi Doğrulayan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static bool IsValidUrl(this string text)
        {
            Regex r = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
            return r.IsMatch(text);
        }
    }
}

Örnek kullanım;

string Adres = "http://www.enginpolat.com";
bool AdresDogru = Adres.IsValidUrl();

Email Adresi Doğrulayan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static bool IsValidEmail(this string text)
        {
            Regex r = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
            return r.IsMatch(text);
        }
    }
}

Örnek kullanım;

string Adres = "test@test.com";
bool AdresDogru = Adres.IsValidEmail();

Klasör Oluşturan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static void CreateDirectory(this DirectoryInfo dirInfo)
        {
            if (dirInfo.Parent != null)
                CreateDirectory(dirInfo.Parent);
            if (!dirInfo.Exists)
                dirInfo.Create();
        }
    }
}

Örnek kullanım;

var dir = new DirectoryInfo(@"C:\temp\bir\iki\uc");
dir.CreateDirectory();

Tarihin Haftasonuna Geldiğini Doğrulayan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static bool IsWeekend(this DateTime value)
        {
            return (value.DayOfWeek == DayOfWeek.Sunday || value.DayOfWeek == DayOfWeek.Saturday);
        }
    }
}

Örnek kullanım;

for (DateTime date = BaslangicTarih; date <= BitisTarih; date = date.AddDays(1))
{
    if (date.IsWeekend())
        continue;
    /// Tatil değil, yapılacak işler yapılır.
}

Object türünden JSON’a, JSON’dan Object Türüne Çeviren Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static string ToJson(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static T FromJson<T>(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Deserialize<T>(obj as string);
        }
    }
}

Örnek kullanım;

Personel Engin = new Personel("Engin Polat", 5000);
string json = Engin.ToJson();
Engin = null;
Engin = s.FromJson<Personel>();

Tarihten Yaş Hesaplayan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static int Age(this DateTime tarih)
        {
            DateTime now = DateTime.Now;
            int yas = now.Year - tarih.Year;
            if (now < tarih.AddYears(yas))
                yas--;
            return yas;
        }
    }
}

Örnek kullanım;

DateTime AhmetDogumGunu = new DateTime(1979, 05, 07);
int Yas = AhmetDogumGunu.Age();

Ayın İlk Gününü - Ayın Son Gününü Bulan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static DateTime FirstDayOfMonth(this DateTime date)
        {
            return new DateTime(date.Year, date.Month, 1);
        }

        public static DateTime LastDayOfMonth(this DateTime date)
        {
            return new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1).AddDays(-1);
        }
    }
}

Örnek kullanım;

DateTime Simdi = DateTime.Now;
MessageBox.Show("Ayın ilk günü: " + Simdi.FirstDayOfMonth().ToShortDateString());
MessageBox.Show("Ayın son günü: " + Simdi.LastDayOfMonth().ToShortDateString());

Dosyanın MD5 Değerini Hesaplayan Extension Method

namespace ExtensionManager
{
    public static class Extensions
    {
        public static string GetMD5(this string filename)
        {
            string result = string.Empty;

            try
            {
                MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
                FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                byte[] arrByteHashValue = md5Provider.ComputeHash(fileStream);
                fileStream.Close();

                string hashData = BitConverter.ToString(arrByteHashValue).Replace("-", "");
                result = hashData;
            }
            catch()
            {
            }
            return result.ToLower();
        }
    }
}

Örnek kullanım;

string Dosya = @"C:\Temp\DosyaAdi.txt";
MessageBox.Show(Dosya + " dosyasının MD5 değeri: " + Dosya.GetMD5());


LINQ ile Bilgisayara Kurulu Programları Sorgulamak

Bu yazımda, bilgisayarda kurulu programları, LINQ kullanarak nasıl sorgulayacağımızı inceleyeceğim.

Bilgisayara kurduğumuz her program bilgisayarın Registry‘sine kurulum ile ilgili bir kayıt bırakır.

Bilmeyenler için not: Registry’yi açmak için komut satırına regedit yazmanız yeterli.

Registry ile ilgili daha detaylı bilgi için MSDN: Registry sayfasına bakmanızı tavsiye ederim.

Registry‘nin LocalMachine\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall dalında, bilgisayara kurulu olan uygulamalara ve bu uygulamalar ile ilgili bilgilere ulaşılabilir.

Uygulamamızda, Registry class’ını kullanabilmek için, kodumuza aşağıdaki namespace’i eklememiz gerekiyor.

using Microsoft.Win32;</pre> Hemen form tasarlamakla başlayalım.

Bilgisayarda Kurulu Programlar Ana Form Ekran Görüntüsü

Yukarıdaki formu oluşturduktan sonra btnGetir butonunun Click olayına aşağıdaki kodu yazalım;

using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
    var programlar = from k in rk.GetSubKeyNames()
                     let r = rk.OpenSubKey(k)
                     select r.GetValue("DisplayName");

    foreach (string program in programlar)
        if (!string.IsNullOrWhiteSpace(program))
            lbProgramlar.Items.Add(program);
}

Registry sınıfının static LocalMachine üyesi üzerinden OpenSubKey() method’unu çağırıyoruz.

Daha sonra yaptığımız;

from k in rk.GetSubKeyNames()
let r = rk.OpenSubKey(k)
select r.GetValue("DisplayName");

**LINQ** sorgusunu yazmak oluyor. Bu sorgu, ilgili **Registry** dalının altında bulunan tüm dalları açar ve içlerindeki **DisplayName** anahtarının değerini getirir.

Son olarak basit bir *foreach* döngüsü ile bu değerleri *lbProgramlar* **Listbox** kontrolüne dolduruyoruz.

İşte benim bilgisayarımdaki sonuç;

![Bilgisayarda Kurulu Programlar Çalıştıktan Sonraki Ekran Görüntüsü](/assets/uploads/2010/01/BilgisayaraKuruluProgramlar_2.png "Bilgisayarda Kurulu Programlar Çalıştıktan Sonraki Ekran Görüntüsü")

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı