Ufak tefek olayları yazdığım programlar ile halletmeyi seviyorum =) .
Torrent'çi olduğumdan bilgisayarımda bir download manager tarzı bir
program olmuyor ve sırf dosya indirmek içinde firefox'u arkada
çalıştırmak istemem kalabalık yapıyor.Bende ufak birşey yaptım tek
linki veriyorsun el altında kalabalık yapmadan tray'de durarak indirme
işini yapıyor bittiği zaman uyarıda vermektedir.Adı Seas Download :) . Programın şekli aşağıdaki gibidir.
İndireceğiniz linki kopyaladıktan sonra mouse'unuz URL textbox'ının üzerine geldiğinde otomatik olarak clipBoard'dan indirmek istediğiniz dosya adresini kendisi alır.İlk çalıştırdığınızda Ayarlar'dan dizin seçmeniz gerekmektedir.
İndirme işleminin temeline bakacak olursak using System.Net namespace'inde bulunan WebClient sınıfı kullanıldı.Bu sınıfdan bir nesne örneklendiğinde DownloadFileAsync() metoduna ilk parametresine indirilecek olan dosyanın adresi ikinci parametresine ise kayıt dizinini belirtmek yeterli oluyor.Olayın özü bu.Zaten diğer kodlarda oldukça açıklayıcı karışık bir yapı yok.Kompleks bir yapı oluşturulmadı program içerisinde.
Ana işlemlerin yapıldğı kodları yayınlayacağım.Ayarlar, güncelleme formlarının kodlarını isteyenler projeyi indirip inceleyebilirler.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
using System.IO;
using System.Threading;
using Microsoft.Win32;
namespace SeasDosyaIndirme
{
public partial class FormMain : Form
{
//Dosyayı indirmemizi sağlayan nesnemizi global olarak oluşturuyoruz.
WebClient wc = new WebClient();
//Uri nesnesinden dosyaAdresi adındaki nesnemizde indirilecek adresi tutucaz.
Uri dosyaAdres;
//Bu 3 değerde kayıt defterine gireceğimiz değerler
string kayitedilecekDizin;
int seasDownloadDurum;
int seasDownloadDurum1;
public FormMain()
{
InitializeComponent();
}
private void DosyaIndir()
{
try
{
//Url textbox'ımızdaki değeri alıp adresi tutacağımız değişkene atıyoruz
dosyaAdres = new Uri(txtUrl.Text);
//WebClient nesnemizin DownloadProgressChanged event'i dosya inerkenki anlık durumu öğrenmek için kullanıcaz.BU olaya atanan FileComplete isimli metotda işlemlerimizi yapacağımızdan parametre olarak veriyoruz.
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(FileComplete);
//aynı şekilde WebClient nesnesini kullanarak indirmekte olduğumuz dosya tamamlandığında nesnemizin DownloadFileCompleted metodu çalışacaktır.Event'e tamamlandığında çalışacak olan metodumuzuda belirtiyoruz.
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadComplete);
//Ve WebClient nesnemizin DownloadFileAsync ismli metodu bizden ikitane parametre istiyecektir.Bunlar dosyanın ineceği adres ve inecek olan dosyanın kayıt yeri.Bu metot dosya indirme işini yapacaktır.
wc.DownloadFileAsync(dosyaAdres, txtKayitYol.Text);
//dosya indirme işlemi sorunsuz ise label'lerimizi ve butonlarımızı mantıgğımız doğrultusunda düzenliyoruz.
lblDurumDeger.Text = "Dosya indiriliyor";
btnIndir.Enabled = false;
txtUrl.Enabled = false;
txtKayitYol.Enabled = false;
lblBaslangicDeger.Text = "";
lblBitisDeger.Text = "";
lblBaslangicDeger.Text = DateTime.Now.ToString();
}
//Dosya indirme işleminde problem yaşanırsa yukarıdaki try blogu çalışmayacağından burada kulllanıcıya hata verecektir.
catch
{
MessageBox.Show("URL problemi yaşandı");
}
}
//Dosya indirimi tamamlandığında çalışan metot.Yukarıda event'le işaretlemiştik hatırlarsınız...
void DownloadComplete(object sender, AsyncCompletedEventArgs e)
{
lblDurumDeger.Text = "İndirme tamamlandı";
//tamamlandığında Process sınıfının Start metodu ile programda belirtmiş olduğumuz dizine gidiyoruz.
Process.Start(kayitedilecekDizin);
notifyIcon1.ShowBalloonTip(0, "Seas Download", "Durum : " + lblDurumDeger.Text, ToolTipIcon.Info);
btnAyarlar.Enabled = true;
btnIndir.Enabled = true;
txtKayitYol.Enabled = true;
txtUrl.Enabled = true;
lblBitisDeger.Text = DateTime.Now.ToString();
}
//Dosya indirirkenki çalışan metot.İnme oranını görebiliriz.Yine bunu yukarıda try bilogu içinde event'e bağlamıştık.
void FileComplete(object sender, DownloadProgressChangedEventArgs e)
{
//pByuklenen bizim ProgressBar'ımız. e.ProgressPercentage diyerek o anki oranı yansıtabiliyoruz.
pBYuklenen.Value = e.ProgressPercentage;
if (e.TotalBytesToReceive / 1000 > 1)
{
lblToplamBoyutDeger.Text = (e.TotalBytesToReceive / 1000).ToString() + " KB" + " / " + (e.BytesReceived / 1000).ToString() + " KB" ;
}
btnAyarlar.Enabled = false;
}
//İndir butonumuz.En üstte tanımlamış olduğumuz metodu çağıracaktır.
private void btnIndir_Click(object sender, EventArgs e)
{
DosyaIndir();
}
//Tıklandığında kayıt dizini olarak belirten klasöre gidecektir.Bu bilgiyi ayarlardan her değiştirildiğinde Kayıt defterimize yazıcaktır.Yazılmış olan bilgiyi Registry'den okuyup gelen değişkenine atıyoruz ve Start metodu ile elimizde bulunan klasör yolu ile kayıt dizini dosyamızı görüntülüyoruz.
private void btnKlasor_Click(object sender, EventArgs e)
{
string gelen = Registry.CurrentUser.OpenSubKey("SEAS").GetValue("seasDownloadDizin").ToString();
Process.Start(gelen);
}
//Ayarla formunu açan butonumuz.
private void btnAyarlar_Click(object sender, EventArgs e)
{
frmAyarlar frmAyarlar = new frmAyarlar();
frmAyarlar.ShowDialog(this);
}
//Formumuzun Load olayında çalışacak olan metot.Try blogu içersinde Registry'de bulunan dizin dosyamızın adresini almaya çalışıyoruz.Ama program ilk defa çalıştığında adres bulamayacağı için ve hata vereceği için bunu try catch blogu oluşturarak halletim.İlk okumada hata vereceğinden otomatik olarak catch bloguna düşüğ kullanıcıya Ayarlar formundan bir dizin seçmesine zorluyorum.Ayarlar formundan bir dizin seçilirse artık program her açıldığında Kayıt defterinden dizin adresi alacağından sonraki çalıtırmalarda otomatik olarak artık try blogu çalışacaktır.
void DosyadanAyarOku()
{
try
{
string gelen = Registry.CurrentUser.OpenSubKey("SEAS").GetValue("seasDownloadDizin").ToString();
txtKayitYol.Text = gelen;
kayitedilecekDizin = gelen;
txtUrl.Enabled = true;
btnKlasor.Enabled = true;
}
catch
{
Registry.CurrentUser.CreateSubKey("SEAS").SetValue("seasDownloadDurum", 0);
seasDownloadDurum = int.Parse(Registry.CurrentUser.OpenSubKey("SEAS").GetValue("seasDownloadDurum").ToString());
txtKayitYol.Text = "Ayarlar menüsünden dizin seçiniz";
txtUrl.Enabled = false;
btnKlasor.Enabled = false;
}
}
private void FormMain_Load(object sender, EventArgs e)
{
//Yukarıdaki metotu çağırıyoruz.
DosyadanAyarOku();
}
//Form çarpıdan kapatıldığında görünmez yapıypruz ve eklemiş olduğumuz notifyIcon ile tray'de çalışmasını sağlıyoruz.
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Visible = false;
notifyIcon1.ShowBalloonTip(0, "Seas Download", "Durum : " +lblDurumDeger.Text, ToolTipIcon.Info);
}
//notifyIcon menümüzdeki aç menüsü.Programı açar.
private void açToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Visible = true;
}
//notifyIcon'a çift tıklanırsada program açılır
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Visible = true;
}
//notifyIcon'a atamış olduğumuz menüden çıkış seçilirse uyugulama sonlanıyor.
private void çıkışToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.ExitThread();
}
//kayıt yolda bir silme yaptığımızda değiştirdğimizde birdaha programı açıp kayıt dizinini çağıracağımıza o alanı temizleyip tekrar regedit'den dizin adını alıyorum.Dizin text'inde araya karakter falan eklerseniz yanlışlıkla çift tıklamanız yeter o textBox'a.
private void txtKayitYol_MouseDoubleClick(object sender, MouseEventArgs e)
{
txtKayitYol.Text = String.Empty;
DosyadanAyarOku();
}
//Ayarlar formundan dizin seçildiğinde çağıralan metot.Dizin değerini okuyup alıyoruz.
public void FrmAyarlarTxtUrlOlayi()
{
string gelen = Registry.CurrentUser.OpenSubKey("SEAS").GetValue("seasDownloadDizin").ToString();
txtKayitYol.Text = gelen;
lblDurumDeger.Text = "Dizin eklendi";
DosyadanAyarOku();
}
//notifyIcon'da bulunan hakkında menüsünü tıkladığında çalışan metot
private void hakkındaToolStripMenuItem_Click(object sender, EventArgs e)
{
frmHakkinda frmHakkinda = new frmHakkinda();
frmHakkinda.ShowDialog();
}
//notifyIcon'de bulunan versiyon Kontrol menüsünü açan metot.
private void versiyonKontrolToolStripMenuItem_Click(object sender, EventArgs e)
{
frmGuncelleme frmGuncelle = new frmGuncelleme();
frmGuncelle.ShowDialog();
}
//İndirmeyi başlatmadan indirmek istediğiniz dosyayı kopyalayacağınızdan o adresi direk hafızan alıyoruz.URL TextBox'ının üzerine mouse geldiğinde otomatik olarak clipBoard'da bulunan indirmek istediğiniz dosyanın adresi eklenecektir.
private void txtUrl_MouseHover(object sender, EventArgs e)
{
//önceki değeri siliyoruz.
txtUrl.Clear();
try
{
//try blogunda ClipBoard nesnesinin GetText() metodu ile hafızadaki text'i alıyoruz.Buda dosya adresimiz oluyor.
kayitedilecekDizin = txtKayitYol.Text;
txtUrl.Text = Clipboard.GetText();
//iki değişken üzerinden adresimizi alıp gerekli temizleme işlemini yapıyoruz.
int urlAdres = txtUrl.Text.Length;
string deger = txtUrl.Text.Remove(0, urlAdres - 6);
//ve artık kayıt dizinlerimizi okuyarak onun üzerine dosya adını ekleyip işlemimiz tamamlıyoruz.
kayitedilecekDizin = txtKayitYol.Text;
string gelen = Registry.CurrentUser.OpenSubKey("SEAS").GetValue("seasDownloadDizin").ToString();
txtKayitYol.Text = gelen;
string yol = txtKayitYol.Text + "\\" + deger;
txtKayitYol.Text = yol;
if (txtUrl.Text.Length > 20)
{
btnIndir.Enabled = true;
}
lblDurumDeger.Text = "URL eklendi";
}
catch
{
//hafızada url bulunamazsa program uyarı verecektir.
MessageBox.Show("Hafızada URL bulunamadı", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtUrl.Clear();
lblDurumDeger.Text = "URL eklenmedi";
}
}
}
}
/*Serhat TAŞ
www.serhattas.net*/
Visual Studio projesi olarak indir
Setup olarak indir
Dosya indirme işlemini merak edenler için oldukça işe yarayacığını düşündüğümden kodları paylaşmak istedim :)
İyi çalışmalar herkese
Serhat TAŞ