PC İçi Arama Motoru
PC Arama Moturu
Bu örnekte C# ile PC içi arama motoru algoritması yazıyoruz. Windows işletim sistemindeki windows search gibi
Bu örnekte tıpkı windows search benzeri olan bir programın C# ile nasıl yapılacağını göstermek istiyorum. İlk başta kod olarak biraz fazla görünsede aslında sade bir yapısı var sadece arayüz olarakta daha şık görünmesini istediğim için biraz daha fazla kod yazmak zorunda kaldım. Programın temel çalışma prensibi C#'taki System.IO alanında bulunan Directory sınıfındaki GetFileSystemEntries(...) fonksiyonuna dayanır. Bu fonksiyon ile her bir dizine girildiğinde orada bulunan dosyalar ve klasörler isimleriyle bir string dizisine toplanıp tespit edilir ve buna göre arama işlemleri yapılır.
Programa CDEF dizinlerinde arama arama sırasında büyük-küçük harf duyarlılığının açık olup olmaması daha sınırlı bir alanda arama gibi çeşitli arama türlerinide nasıl eklendiğini kodlarda görebilirsiniz. Kodlarla ilgili tüm açıklamaları ise bizzat ilgili kodun yanına yorum olarak detaylı bir şekilde yazdım. Kaynak kodu ise sayfanın sonunda download edebilirsiniz. Artık koda geçmek gerekirse;
ilk önce kullanılan isim alanlarını belirtelim:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO; // directory sınfının ait olduğu isim alanı
şimdi ise Form_load kısmına bakalım:
public Form1()
{
//Çağdaş Üsfekes
// Çankaya üniversitesi - Bilgisayar mühendisliği
InitializeComponent();
}
string line;
string line2;
string git = null;
int find = 0; // arama sonucunda kaç sonuç bulunduğunun sayısını verir
int not = 0; // arama hatalarından sonra boş yere arama sonucu sayfasının açılmasını engeller
int tara = 0; // toplam taranan dosya sayısını verir
int x = 0; // arama süresinin hesaplanması için alınan değer.değeri saniye olarak label30'da yazdırılıyor
#region form load...
private void Form1_Load(object sender EventArgs e)
{
// bu kısımda programın ilk açılışında menülerin kapalı görünmesi için menünün içinde bulundu 2 adet
// groupbox ve arama sırasında detayları bize göstericek olan label ve picturebox'ların ilk başta görünmemesi için
// visible değerlerini false yapıyoruz
pictureBox5.Visible = false;
textBox2.ReadOnly = true;
label6.Visible = false;
label14.Visible = false;
label15.Visible = false;
label16.Visible = false;
label10.Visible = false;
pictureBox9.Visible = false;
groupBox1.Visible = false;
groupBox2.Visible = false;
pictureBox10.Visible = false;
button9.Visible = false;
radioButton3.Checked = true;
radioButton2.Checked = true;
}
#endregion
aramanın başlatılacağı butonun arka plan kodlarını yazalım
#region arama butonu...
private void button3_Click(object sender EventArgs e)
{
// arama işlemine başlanmasını sağlayan kod
label14.Text = "";
label15.Text = "";
label16.Text = "";
button3.Enabled = false; // arama yapılırken bir daha arama butonuna basılmasın diye enable=false yapıyoruz
pictureBox2.Enabled = false;
backgroundWorker1.RunWorkerAsync();
label14.Visible = true;
label15.Visible = true;
label16.Visible = true;
button9.Visible = true; // arama sırasında iptal butonunun görünürlüğü true yapılıyor
// arama sırasında arada kalan süreyi hesap edebilmek için burada timer etkinleştiriliyor.
arama_suresi.Enabled = true;
}
#endregion
Şimdi ise aramanın başlayacağı ve menüden yaptığımız ayarların uygulandığı asıl bölümü inceliyelim. Bu arada arama sırasında arka planda çok yoğun bir işlem gerçekleştiği ve bu yüzdende ekranın arama sırasında donmasını engelleyip kullanılabilir durumda tutmak için arama işimizi bir Backgroundworker ile yapıyoruz.Kodumuzu backgroundworker içine koyarak Do_Work Progress_Changed ve RunWorker_Completed adlı 3 fonksiyonu yazıyoruz.Bununla ilgili daha detayı msdn'den öğrenebilirsiniz
#region arama tetikleyen fonksiyon...
private void tarama(BackgroundWorker bDoWorkEventArgs eobject sender)
{
if (textBox1.Text.Length == 0) /////////////////////////////arama kutusu boş bırakılırsa hata veriyor.
{
MessageBox.Show("Arama kutusunu boş bırakamazsınız!" "Discoovery - Arama Hatası");
not++; // burada not değerini artırarak arama sonucu sayfasını açmasını engelliyoruz
}
if (textBox1.Text.Length != 0 && textBox2.Text.Length != 0)///////////////kullanıcının aramayı kendisinin istediği yerden başlatması
{
// burada arama C D gibi en baş dizinlerden değilde kullanıcının kendi belirlediği daha alt bi dizinden başlatılıyor.
// böylece aramak istediğiniz bir resim dosyası ise bulunma ihtimali yüksek olan "Resimlerim" klasörü ve daha alt
// dizinlerinde aratıyoruz böylece gereksiz yere tüm PC aramaktan kurtulup zaman kazanmış oluyoruz
string[] x = Directory.GetFileSystemEntries(textBox2.Text);
if (radioButton2.Checked) //dosya ara( müzik video text belgeleri vb)
{
foreach (string a in x)
search(sender as BackgroundWorker a e);
}
if (radioButton1.Checked) //klasör ara (sadece klasörler)
{
foreach (string a in x)
search1(sender as BackgroundWorker a e);
}
if (radioButton5.Checked) //dosya ve klasör ara
{
foreach (string a in x)
search2(sender as BackgroundWorker a e);
}
}
if(textBox1.Text.Length!=0 && textBox2.Text.Length==0) ////////////////sınırlı arama boş bırakılırsa arama burdan devam eder
{
if (radioButton4.Checked) //////////////////////webde ara( direk google'da arar ve arama sonuçlarının sayfasını görüntüler)
{
string a = textBox1.Text;
a = a.Replace(" " "+"); // google'da arama linkinin oluşturulması için aranan kelime içinde boş bırakılan
// her karakter '+' karakteriyle değiştirilir.
System.Diagnostics.Process.Start("http://www.google.com.tr/search?q=" + a);
// not değeri artırılır ve webde arama yapıldığı halde Pcde arama sonuçlarının listelendiği sayfanın
// açılmasının önüne geçilmiş olur. bunu nasıl kullandığımızı daha aşağıda tam olarak görebilirsiniz
not++;
}
if (radioButton3.Checked) ////////////////////////pcde ara (bilgisayarda aramanın başlatılacağı kod parçası)
{
if (!checkBox2.Checked && !checkBox3.Checked && !checkBox4.Checked && !checkBox5.Checked)
{
// eğer arama için hiç bir dizin seçilmediyse hata mesajı verir
// "not" değerini artırmamızın sebebi eğer işlem bu hata alanına girerse arama olmadığı halde arama sonucu
// sayfasının açılmasını engellemek.arama sonucu sayfasının açılacağı yere if(not==0) koşulunu koyarsak
// bu isteğimizi gerçekleştirebiliriz.
not++;
MessageBox.Show("Arama için dizin seçiniz" "Discoovery - Arama");
}
else
{
if (checkBox2.Checked) //C sürücüsünde arama
{
if (Directory.Exists("C:\\"))
{
string[] x = Directory.GetFileSystemEntries("C:\\");
if (radioButton2.Checked) //dosya ara
{
foreach (string a in x)
search(sender as BackgroundWorker a e);
}
if (radioButton1.Checked) //klasör ara
{
foreach (string a in x)
search1(sender as BackgroundWorker a e);
}
if (radioButton5.Checked) //dosya ve klasör ara
{
foreach (string a in x)
search2(sender as BackgroundWorker a e);
}
}
else
{
// eğer C sürücüsü bulunamazsa haat mesajı verir ve arama yapılmadan arama sonucu sayfasının
// açılmasını engellemek için not değerini artırıyoruz.
not++;
MessageBox.Show("C:\\ dizini bulunamadı" "Discoovery - Arama");
}
}
if (checkBox3.Checked) //D sürücüsünde arama
{
if (Directory.Exists("D:\\"))
{
string[] x = Directory.GetFileSystemEntries("D:\\");
if (radioButton2.Checked) //dosya ara
{
foreach (string a in x)
search(sender as BackgroundWorker a e);
}
if (radioButton1.Checked) //klasör ara
{
foreach (string a in x)
search1(sender as BackgroundWorker a e);
}
if (radioButton5.Checked) //dosya ve klasör ara
{
foreach (string a in x)
search2(sender as BackgroundWorker a e);
}
}
else
{
// D sürücüsü bulunamadı ise hata mesajı verir.
not++;
MessageBox.Show("D:\\ dizini bulunamadı" "Discoovery - Arama");
}
}
if (checkBox4.Checked) //E sürücüsünde arama
{
if (Directory.Exists("E:\\"))
{
string[] x = Directory.GetFileSystemEntries("E:\\");
if (radioButton2.Checked) //dosya ara
{
foreach (string a in x)
search(sender as BackgroundWorker a e);
}
if (radioButton1.Checked) //klasör ara
{
foreach (string a in x)
search1(sender as BackgroundWorker a e);
}
if (radioButton5.Checked) //dosya ve klasör ara
{
foreach (string a in x)
search2(sender as BackgroundWorker a e);
}
}
else
{
// E sürücüsü bulunamadı ise hata mesajı verir ve arama sonucunun sayfası açılmaması için not 1 artırılır
// eğer o sırada cd-room'da bi vcd veya dvd takılı değilse muhtemelen E sürücüsü bulunamıyacaktır.
not++;
MessageBox.Show("E:\\ dizini bulunamadı" "Discoovery - Arama");
}
}
if (checkBox5.Checked) //F sürücüsü-flaş disk
{
if (Directory.Exists("F:\\"))
{
string[] x = Directory.GetFileSystemEntries("F:\\");
if (radioButton2.Checked) //dosya ara
{
foreach (string a in x)
search(sender as BackgroundWorker a e);
}
if (radioButton1.Checked) //klasör ara
{
foreach (string a in x)
search1(sender as BackgroundWorker a e);
}
if (radioButton5.Checked) //dosya ve klasör ara
{
foreach (string a in x)
search2(sender as BackgroundWorker a e);
}
}
else
{
// F sürücüsünün bulunamama koşulunda çıkacak olan hata mesajı
not++;
MessageBox.Show("F:\\ dizini bulunamadı" "Discoovery - Arama");
}
}
}
}
}
}
#endregion
Şimdi ise aramanın yapıldığı ve recursive functions temeline dayanan 3 arama fonksiyonun kodlarını yazalım. Ben yazarken dosya arama için search() klasör arama için search1() ve hem dosya hem klasör arama içinde search2() olmak üzere 3 farklı fonksiyon yazdım. Aslında bunların hepsini birleştirip 1 fonksiyonda yazabilirdik belki kodumuz biraz daha kısa olurdu ama o zamanda arama hızı düşecekti çünkü hepsini bir fonksiyonda topladığımızda o fonk. daha uzun olacaktı ve arama sırasında da recursive işleminin gerçekleşmesi daha ağır adımlarla olacaktı. Kodları olabildiğince biririnden ayrı tutarak her bir fonksiyonu daaha sadeleştirmiş olduk.
#region arama fonksiyonları...
public void search(BackgroundWorker b string a DoWorkEventArgs e) //dosya arama(resim müzik video vb.)
{
try
{
// aşağıdaki a stringini line2'ye eşitlememizin sebebi arama sırasında hangi yolda arama yapıldığını
// ekranda devamlı güncel olarak görmek istememizdendir.line2.length değerini rapor ederek arama anında
// devamlı line2nin değişimini gözleyerek ekranda görebiliriz
line2 = a;
b.ReportProgress(line2.Length);
for (int i = 0; i <= 0; i++)
{
if (b.CancellationPending)
{
// arama sırasında arama iptal edilirse cancel değeri true edilir.
e.Cancel = true;
break;
}
// eğer adı "a" olan yolumuzun örneğin(C:\WINDOWS) devamına '\' koyarsak ve bu yolun geçerli olup olmadığı
// kontrol edersek bu yolun bir klasörmü yoksa bir dosyamı olduğunu anlarız eğer geçerli değilse dosyadır
// ve bizde bu fonksiyonda sadece dosya aradığımıza göre geçerli olmama koşulunu arıcaz
// örneğin C:\WIDOWS\eula.txt\ yolu geçerli değildir. ve bu koşula girer
if (!Directory.Exists(a + @"\"))
{
if (checkBox6.Checked)// arama sırasında küçük-büyük harf duyarlılığı checkli değil ise
{
// tara değeri o ana kadar kaç dosyanın arandığını belirtir
tara++;
// ve bu değeri rapor ederek ekranda arama sırasında güncel verileri alırız
b.ReportProgress(tara);
//fileinfo sınıfı ile aradığımız anahtar kelimenin o dosya isminde geçip geçmediğine bakarız
// eğer geçmiyorsa -1 değeri döner yani aradığımız kelimenin bu dosya olma olasılığı yoktur
// -1 değeri döndürmüyorsa içinde geçiyor demektir ve aradığımız kelimeyle ilişkili demektir
FileInfo f = new FileInfo(a);
if (f.Name.IndexOf(textBox1.Text) != -1)
{
find++;
b.ReportProgress(find);
// bu sonucu arama sonucu sayfasındaki listbox'a ekliyoruz.
listBox1.Items.Add(a);
}
}
if (!checkBox6.Checked) // aramada küçük-büyük harf duyarlılığı checkli ise
{
line = a;
tara++;
b.ReportProgress(tara);
FileInfo f = new FileInfo(a);
// yoldaki dosya isminde bulunan tüm harfleri küçük harf yapıp arama kutusundan girdiğimiz anahtar
// kelimeninde harflerini küçük yapıp eşleştiriyoruz yani küçük-büyük harf duyarlılığı kapalı
if (f.Name.ToLower().IndexOf(textBox1.Text.ToLower()) != -1)
{
// bulunan dosya sayısını bir artırıyoruz ve bunu raporluyoruz
find++;
b.ReportProgress(find);
listBox1.Items.Add(line);
}
}
}
else
{
// burada ise yolumuzun bir dosya değil bir klasör olduğu ve bu yüzdende içine girip tekrar devamında
// dosya veya klasör varmı diye bakmak için aramayı devam ettiririz.
// bu metot recursive(kendi kendini çağıran) fonksiyonlara tipik bir örnektir
string[] x1 = Directory.GetFileSystemEntries(a);
tara++;
foreach (string a1 in x1)
search(b a1 e);
}
}
}
catch
{
// try-catch bloğunda ise bazı dosyalara girememe olasılığına karşı programın hata verip kapanmayıp atlayıp
// deva etmesini sağlıyoruz
}
}
public void search1(BackgroundWorker b string a DoWorkEventArgs e) //klasör arama
{
// bu arama fonksiyonunda ise üsteki dosya aramada yaptığımız herşeyi klasör için yapıyoruz
try
{
line2 = a;
b.ReportProgress(line2.Length);
for (int i = 0; i <= 0; i++)
{
if (b.CancellationPending)
{
e.Cancel = true;
break;
}
if (Directory.Exists(a + @"\"))
{
tara++;
b.ReportProgress(tara);
DirectoryInfo d = new DirectoryInfo(a);
if (checkBox6.Checked)
{
if (d.Name.IndexOf(textBox1.Text) != -1)
{
find++;
b.ReportProgress(find);
listBox1.Items.Add(a);
}
}
if (!checkBox6.Checked)
{
line = a;
if (d.Name.ToLower().IndexOf(textBox1.Text.ToLower()) != -1)
{
find++;
listBox1.Items.Add(line);
}
}
string[] x1 = Directory.GetFileSystemEntries(a);
foreach (string a1 in x1)
search1(b a1 e);
}
else
{
}
}
}
catch
{
}
}
public void search2(BackgroundWorker b string a DoWorkEventArgs e) //dosya ve klasör arama
{
// bu aramada ise yukarıdaki methodların aynısını hem dosya hemde klasör için uyguluyoruz
try
{
line2 = a;
b.ReportProgress(line2.Length);
for (int i = 0; i <= 0; i++)
{
if (b.CancellationPending)
{
e.Cancel = true;
break;
}
if (Directory.Exists(a + @"\")) //klasör ise buraya girer
{
tara++;
b.ReportProgress(tara);
DirectoryInfo d = new DirectoryInfo(a);
if (checkBox6.Checked)
{
if (d.Name.IndexOf(textBox1.Text) != -1)
{
find++;
b.ReportProgress(find);
}
string[] x1 = Directory.GetFileSystemEntries(a);
foreach (string a1 in x1)
search2(b a1 e);
}
if (!checkBox6.Checked)
{
line = a;
if (d.Name.ToLower().IndexOf(textBox1.Text.ToLower()) != -1)
{
find++;
b.ReportProgress(find);
listBox1.Items.Add(line);
}
string[] x1 = Directory.GetFileSystemEntries(a);
foreach (string a1 in x1)
search2(b a1 e);
}
}
if (!Directory.Exists(a + @"\")) // dosya ise buraya girer
{
tara++;
b.ReportProgress(tara);
FileInfo f = new FileInfo(a);
if (checkBox6.Checked)
{
if (f.Name.IndexOf(textBox1.Text) != -1)
{
find++;
b.ReportProgress(find);
listBox1.Items.Add(a);
}
}
if (!checkBox6.Checked)
{
line = a;
if (f.Name.ToLower().IndexOf(textBox1.Text.ToLower()) != -1)
{
find++;
b.ReportProgress(find);
listBox1.Items.Add(line);
}
}
}
}
}
catch
{
}
}
#endregion
şimdi ise menüde bulunan sınırlı arama yapmak için dizin seçtiğimiz butonun kodunu yazalım. buton6 ile açılan pencereden klasör seçiyoruz ve oradan itibaren arama başlatıyoruz. buton7 ilede seçtiğimiz dizinin yazıldığı textbox'ı temizliyoruz
private void button6_Click(object sender EventArgs e)
{
// buton6 ile kullanıcının daha yerel ve sınırlı bir alanda arama yapması için dizin seçmesi sağlanıyor
//böylece arama sadece o klasör ve onun alt dizinlerinde bulunan tüm yerlerde olur
textBox2.Text = "";
FolderBrowserDialog fo = new FolderBrowserDialog();
DialogResult rs = fo.ShowDialog();
textBox2.Text = fo.SelectedPath;
}
private void button7_Click(object sender EventArgs e)
{
// seçilenin dizinin gösterildiği kutucuğu temizler
textBox2.Text = "";
}
Sıra geldi aramanın yapıldığı backgroundworker olaylarını yazmaya. yukarda da belirttiğimiz gibi bu olay içerisinde 3 fonksiyon olduğunu söylemiştik. Ve bunların faydasının ise ekranın donup kullanılamaz hale gelmesini önlemekti. bu 3 fonksiyonda şöyle:
private void backgroundWorker1_RunWorkerCompleted(object sender RunWorkerCompletedEventArgs e)
{
// arama sonlandığında sonuçlar burada ekrana yazılır
arama_suresi.Enabled = false;
// arama sırasında çalışan arama_süresi.timer arada geçen saniyeyi hesaplar ve x değerini ekrana basar.
label30.Text = x + " saniyede arandı";
// burada ise arayüzümüzün daha hoş görünmesi amacı ile hiç bir sonuç bulunamadıysa X işaretli bir resim
// ama sonuç bulunduysa check işaretli bir resim gösterilir
if (find != 0)
{
pictureBox15.Image = global:iscoovery___Search_Everything.Properties. Resources.Good;
label12.Text = "Toplam " + Convert.ToString(find) + " sonuç bulundu";
}
if (find == 0)
{
pictureBox15.Image = global:iscoovery___Search_Everything.Properties. Resources.Error;
label12.Text = "Hiç bir sonuç bulunamadı!";
}
if (not == 0)
{
// herhangi bir dizin seçilmeden veya arama kutusu boş bırakılarak arama yapılması sonucunda not değerini 1
// artırmıştık ve böylece boş yere arama sonucu sayfasının açılmasını engellemiştik. not değeri 0 ise
// not değeri artmamaış yani hiç bir hata mesajına girilmemiştir böylecede sonuç sayfası açılacaktır
tabControl1.SelectedIndex = 1;
label14.Text = "'" + textBox1.Text + "'" + " PC'de arandı";
}
// bir sonraki arama için tüm değerler 0'lanıyor
find = 0; // bulunan sonuç sayısı
tara = 0; // taranan dosya sayısı
not = 0;
button3.Enabled = true;
pictureBox2.Enabled = true;
button9.Visible = false;
pictureBox5.Visible = false;
label29.Text = "";
}
private void backgroundWorker1_ProgressChanged(object sender ProgressChangedEventArgs e)
{
// arama sırasında ekrana güncel olarak o anda aranan dosya sayısı bulunan dosya sayısı ve de
// aramanın sürdüğü dizini ekrana yazan fonksiyon
pictureBox5.Visible = true;
label14.Text = "'" + textBox1.Text + "'" + " PC'de aranıyor...";
label15.Text = "Taranan öğe sayısı: " + tara;
label16.Text = "Bulunan öğe sayısı: " + find;
label29.Text = line2;
button3.Enabled = false;
}
geriye ise soldaki ve sağdaki menülerin açılıp kapanma efektlerini verebilmemiz için onların visible değerleriyle oynamamız kaldı sıradaki kodları verip programı bitirelim:
private void pictureBox2_MouseClick(object sender MouseEventArgs e) // büyüteç resmi
{
// arama kutusunun yanında büyüteç resminin tıklanmasıyla aramayı başlatan bölüm
button3_Click(sender e);
}
private void button9_Click(object sender EventArgs e) // iptal butonu
{
// arama sırasında iptal butonun tıklanması ile arama sona erer
backgroundWorker1.CancelAsync();
}
private void label17_MouseClick(object sender MouseEventArgs e)
{
// programın 'hakkında' bilgilerini içeren pencereyi açar
Form2 f2 = new Form2();
f2.Show();
}
private void pictureBox8_MouseClick(object sender MouseEventArgs e)
{
// solda bulunan menüyü açmaya yarayan resim. üzerine tıklanınca menü görünür hale gelir
groupBox1.Visible = true;
pictureBox9.Visible = true;
pictureBox8.Visible = false;
label3.Visible = false;
}
private void pictureBox9_MouseClick(object sender MouseEventArgs e)
{
// soldaki açık olan menüyü kapamaya yarar
groupBox1.Visible = false;
pictureBox8.Visible = true;
pictureBox9.Visible = false;
label3.Visible = true;
}
private void pictureBox10_MouseClick(object sender MouseEventArgs e)
{
// sağdaki menüyü kapamaya yarar
pictureBox11.Visible = true;
pictureBox10.Visible = false;
groupBox2.Visible = false;
label1.Visible = true;
}
private void pictureBox11_MouseClick(object sender MouseEventArgs e)
{
// sağdaki menüyü açar
groupBox2.Visible = true;
pictureBox11.Visible = false;
pictureBox10.Visible = true;
label1.Visible = false;
}
private void pictureBox13_MouseClick(object sender MouseEventArgs e)
{
// aram sonucu sayfasından aramanın yapılacağı anasayfaya döner
listBox1.Items.Clear();
tabControl1.SelectedIndex = 0;
}
private void listBox1_MouseDoubleClick_1(object sender MouseEventArgs e)
{
// sonuçların listelendiği listbox'da istediğimiz sonuca çift tıklarsak
// o dosyanın bulunduğu bir alt dizin açılır
// örneğin sonucumuz C:\WINDOWS\eula.rtf ise buna tıkladığımızda C:\WINDOWS dizini açılır
git = listBox1.SelectedItem.ToString();
if (git != null)
{
FileInfo fi = new FileInfo(git);
System.Diagnostics.Process.Start(fi.DirectoryName) ;
}
}
private void arama_suresi_Tick(object sender EventArgs e)
{
// arama sırasında geçen süreyi saniye cinsinden hesaplıyan timer
x++;
}
böylece programımızı bitirmiş olduk. kodların nerde ne işe yaradıklarını olabildiğince yanlarında anlatmaya çalıştım. yeterince anlaşılır olmuştur sanırım. programın arayüzününde güzel görünmesi için yazdığımız kodları daha iyi görebilmeniz için kaynak kodu download etmenizde fayda var.
Dikkat etmek gerekirse bütün bu pencereler tek bir form üstünde açıldı. Bunun için 2 sayfası olan bir tabcontrol kullanmamız yeterli oldu. Tabcontrol boyutlarını form boyutlarına eşitlersek farklı sayfalar üstünde çalışabilmiş oluruz.
Birde son olarak belirtmek istediğim bir şey var. Bu programla yapılan arama hızı windows search ile yapılan arama hızıyla aynı olmayacaktır ondan biraz daha yavaş olacaktır. Bunun ise iki sebebi var. Birincisi kod içinde yazdığmız search() search1() search2() adlı arama fonksiyonlarında recursive methodunu kullanmamız. siz daha geliştirmek isterseniz iterative yöntemini deneyebilirsiniz çünkü iterative herzaman recursive yöntemine göre daha hızlıdır. ikinci sebep ise de Windows search direk işletim sistemi içindedir ve makina dilinden çalışır fakat bizim programımız windows üzerinden .NET Framework ile çalışır yani 2. dereceden diyebiliriz.
__________________
بِسْــــــــــــــــــــــمِ اﷲِارَّحْمَنِ ارَّحِيم
-------------------------------------------------
Bu Soysuzlar Bu Vatansızlar Sarsada Yurdumu Ben Yaratan'dan Alırım Asil Kanı ve Gücü. -------------------------------------------------
|