C# ile Dosya İndirme ve ProgressBar’da Gösterme

csharp-visual-studio

Merhaba Arkadaşlar, Uzun bir süreden sonra tekrar beraberiz. Derslerimize hız kesmeden devam ediyoruz. C# ile jpg, swf, exe vb. aklınıza gelebilecek her türlü içeriği indirebiliriz. Örnek vermek gerekirse swf içerikli bir linki indirebilmek için harici programlara ihtiyaç duyarız. Ama biz C# ile harici programa gerek kalmadan birkaç satır kod ile bu işlemi yapabiliriz. Ayrıca indirilme işlemini ProgressBar yani Türkçe adıyla ilerleme çubuğunda gösterebiliriz.

Formumuza eklememiz gereken nesneler

  • 1 adet TextBox
  • 1 Adet ProgressBar
  • 1 Adet Button
  • 1 Adet backgroundWorker

Dosya indirirken Formumuzun donmaması için BackGroundWorker kullanacağız. BackGroundWorker’in 3 tane Event’i var. Bunlar DoWork, ProgressChanged ve RunWorkerCompleted olaylarıdır.
DoWork kısmında yapacağımız işlemleri belirleriz.
ProgressChanged kısmında ilerlemesini gösteririz. Genelde kullanılmaz ama ben bu yazımda sizler için kullanacağım.
RunWorkerCompleted kısmında olayları sonuçlandırırız. DoWork kısmında textbox’ yazdırma vb. işlemlerini yapamayız. Aksi taktirde programımız hata verir. Aktarma ve değiştirme işlemlerini bu kısımda yapacağız.

Tüm kodları vermeden önce birkaç kodun ne işe yaradığını sizlere açıklamam gerek. Bu aşağıdaki görmüş olduğunuz kod textbox’a yazdığımız linkteki dosyanın adını çeker. Yapısı gayet basit. Bildiğiniz gibi linklerde genelde slash(/) işaretleri fazlasıyla bulunur. Bu kodda da linkteki son slash’ı bulup dosyanın adını ve uzantısını değişkene çekiyoruz. Böylece birazdan vereceğim indirme kodlarında dosya adı neyse direkt o şekilde indirebiliyoruz. Birazdan vereceğim indirme linkinde bu kod mevcut.

string txt1 = textBox1.Text;
int karaktersayisi = txt1.LastIndexOf('/');
string yazi = txt1.Remove(0, karaktersayisi + 1);

Şimdi backgroundWorker’in tüm bu eventlerini Properties kısmını açıp tıklayıp aktif hale getiriyoruz. Kod kısmında gelip aktif ettiğimiz backgroundworker DoWork olayına aşağıdaki kodları yazıyoruz. Şunu belirtmek isterim bu kodları yabancı bir kaynaktan buldum. Bu kodun yarısından çoğu progressbar’da ilerlemeyi göstermek için kullanılıyor. İlk satırdaki kodu yukarıda açıkladım zaten.
Dokuzuncu satırdaki sUrlToReadFileFrom değişkenine indireceğimiz dosyanın adresini atamak zorundayız. Ben textbox1.Text olarak yazdım. Yani textbox’a ne yazarsak onu indirecektir.
Onuncu satırdaki kod ise indirilen dosyanın hangi ad ve uzantı ile bilgisayarımıza kaydedileceği ile ilgili. En yukarıda bununla ilgili açıklama yapmıştım.
Diğer tüm kodlar progressbar’da ilerlemeyi göstermek için kullanılıyor.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string txt1 = textBox1.Text;
                int karaktersayisi = txt1.LastIndexOf('/');
                string yazi = txt1.Remove(0, karaktersayisi + 1);

                string sUrlToReadFileFrom = textBox1.Text;
                string sFilePathToWriteFileTo = yazi;
                Uri url = new Uri(sUrlToReadFileFrom);
                System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
                System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
                response.Close();
                Int64 iSize = response.ContentLength;

                Int64 iRunningByteTotal = 0;

                using (System.Net.WebClient client = new System.Net.WebClient())
                {
                    using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
                    {
                        using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
                        {
                            int iByteSize = 0;
                            byte[] byteBuffer = new byte[iSize];
                            while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                            {
                                streamLocal.Write(byteBuffer, 0, iByteSize);
                                iRunningByteTotal += iByteSize;

                                double dIndex = (double)(iRunningByteTotal);
                                double dTotal = (double)byteBuffer.Length;
                                double dProgressPercentage = (dIndex / dTotal);
                                int iProgressPercentage = (int)(dProgressPercentage * 100);

                                backgroundWorker1.ReportProgress(iProgressPercentage);
                            }
                            streamLocal.Close();
                        }
                        streamRemote.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Hata");
            }
        }

backgroundWorker’ın ProgressChanged olayına gelip kodumuzu yazıyoruz. Bu kod ProgressBar’da ilerlemeyi gösterecektir.

 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

İndirme işlemi tamanlanınca aşağıda kod bloğu çalışacaktır. Burada MessageBox ile bilgi verebiliriz.

 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          MessageBox.Show("İndirilme İşlemi Tamamlandı.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

Şimdi ise İndir butonunun click olayını açıp aşağıdaki kodu yazmamız gerek eğer bu kodu yazmak ise BackGroundWorker çalışmaz.

private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

Dersimizin sonuna geldik 🙂 Bir daha ki derste görüşmek üzere 🙂


23 comments

  1. Fırat Reply

    Teşekkürler kodlar gayet iyi çalışıyor fakat ben indirilen dosyanın proje dizinine değilde benim belirlediğim dizine indirmesini istesem nasıl yaparım

    • Atakan Yasin Uludağ Post authorReply

      sFilePathToWriteFileTo değişkenini düzenlemeniz gerek. Mesela masaüstüne indirmek istiyorsunuz diyelim. O zaman sFilePathToWriteFileTo değişkenini
      sFilePathToWriteFileTo = “C://Users//KullanıcıAdi//Desktop//” + yazi;
      yapmanız gerek.

      • Fırat Reply

        Teşekkür ederim yardımınız için makaleleriniz çok açıklayıcı iyi günler iyi çalışmalar

  2. Kerimcan Gökdağ Reply

    Merhaba.Benim size bir sorum olacaktı . Ben c# dabir uygulama yapmak istiyorum . Ben textboxa bir site urlsi giricem . o siteye sürekli gir çık yapacak . Ama c# da siteye yönlendirmeyi nasıl yapacağımı bilmiyorum . Bi bilginiz varsa yardımcı olabilir misiniz?

  3. Reorance Reply

    herşey verdiğin gibi aslında. projeyi rar layıp atar mısınız bana rica etsem.

  4. Reorance Reply

    Selamun Aleyküm.
    Hocam verdiğiniz kodlar sıkıntısız çalışıyor fakat şöyle bir sıkıntı var. Kodların hepsini söylediğin gibi yaptım hiç bir problem yok ama url, ftp veya direkt link adresini veriyorum dosya boyutunu bilerek büyük tutuyorum fakat tıklar tıklamaz dosya indi diyor fakat görünürde hiç birşey yok. Problem nedir acaba ?

  5. Görkem Reply

    Yardımlarınız için Çok Teşekkür Ederim Sorunu halletim sorun şuymuş ben kodun button bölümünü kopyalamıştım fakat buttona çift tıkladığımda gelen bölüme dediğiniz kodu ekledim ve sorun çözülmüş oldu.

  6. Görkem Reply

    properiest bölümündeki üst bölümdeki event bölümünden açtım ama galiba start veremedim yardımcı olabilirmisiniz.

    • Atakan Yasin Uludağ Post authorReply

      Zaten kodlarda da verdim ama gözünüzden kaçtı sanırsam ;

      backgroundWorker1.RunWorkerAsync();

      Bu kod ile BackgroundWorker’i başlatmanız gerek. İsterseniz Form Load olayına istersenizde herhangi bir butonun click olayına yazabilirsiniz. Orası size kalmış.

  7. Görkem Reply

    Ben Kodu yazdım herşeyi yaptım hata verdi düzelttim üster System da bölüm oluşturmamışım oda tm fakat programı açtığımda dowloand tuşuna bastığımda öle kalıo ne hata verio nede indiriyo 🙁

    • Atakan Yasin Uludağ Post authorReply

      backgroundWorker ekleyip backgroundWorker_DoWork ve backgroundWorker_RunWorkerCompleted eventlerini açıp kodları eklediniz mi ?
      Ayrıca kodda zaten try catch var. Sorun olsa hata çıkar karşınıza. O zaman burada iki olasılık kalıyor. BackgroundWorker’e start vermediniz veya eventleri doğru açmadınız.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir