BackgroundWorker ve ProgressBar ile FTP İşlemleri.
Bu yazımda Uygulama içerisinde FTP sınıfını kullanarak BackgroundWorker ve ProgressBar
kontollerinden de faydalanarak dosya indirme işlemini inceliyoruz.
Yeni Bir Windows Uygulaması Oluşturuyoruz.(FTPIslem)
1 BackgroundWorker, ProgressBar ve Buton atıyoruz.
Formumuz aşağıdaki gibi şekilleniyor olmalıdır.
FTP bağlantı ve indirme işlemini yapacağımız metodumuzu yazıyoruz.
public void FTPDosyaCek()
{
FtpWebRequest FTP;
try
{
string dosyaYol = Application.StartupPath + @"\" + "dosya.zip";
// Uygulamanın çalıştığı klasörde dosya.zip adıyla kaydediyoruz.
FileStream SR = new FileStream(dosyaYol, FileMode.Create);
// Dosyanın alınacağı ftp yolunu belirliyoruz
FTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://ftp.hakanaksan.com.tr/hakanaksan.com.tr/wwwroot/test.zip"));
// Ftp bağlantısı için Kullanıcı Adı ve Şifremizi belirtiyoruz
FTP.Credentials = new NetworkCredential("hba", "hba01");
// Bu kısımda hangi işlemi yapacağımızı belirtiyoruz, dosya indireceğimiz için DownloadFile methodunu seçiyoruz
FTP.Method = WebRequestMethods.Ftp.DownloadFile;
// Dosya tranferinin Binary türden yapılacağını belirtiyoruz
FTP.UseBinary = true;
// Dosya transfer bilgilerini FtpWebResponse türüne çeviriyoruz
FtpWebResponse response = (FtpWebResponse)FTP.GetResponse();
// Çevirdiğimiz bilgileri kendi PC'miz için dosya oluşturacak Stream'e eşitliyoruz
Stream ftpStream = response.GetResponseStream();
// Dosya boyutunu belirtiyoruz
long cl = response.ContentLength;
// Buffer büyüklüğünü 2KB olarak belirtiyoruz ve değişkenimizi tanımlıoyruz
int bufferSize = 2048;
int readCount;
// Bu kısımda dosyayı binary'e çevirip ftp'den çekiyoruz
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
int i = 0;
while (readCount > 0)
{
i++;
SR.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
// ProgressBarı artırıyoruz
backgroundWorker1.ReportProgress(i);
}
ftpStream.Close();
SR.Close();
response.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Hata");
}
}
Bu Metodu direk çalıştıracak olursak işlem tamamlanana kadar Form kanalı kitlenecek ve uygulama dosya tamamıyla inene kadar etkisiz hale gelecektir bu da büyük boyutlu transfer işlemlerinde çokta hoş bir durum ortaya çıkarmayacaktır, bunu önlemek adına BackgroundWorker ve ProgressBar kullanacağız.
Öncelikle BackgroundWorker’ı inceleyelim,
Propertieslerine bakacak olursak değiştireceğimiz ilk nokta ProgressBar kullanacağımız için WorkerReportProgress özelliği olacaktır, bu özelliği true konumuna getirdikten sonra Eventlerine göz atıyoruz
3 adet eventi vardır ve bu uygulamada hepsini kullanıyor olacağız.
DoWork eventi yapılacak işin başlangıç noktasını oluşturur, ProgressChange eventi ProgressBar’a yansıtma noktasında işimize yarayacaktır, RunWorkerCompleted ise işin bittiği noktada tetiklenecek olan eventtir.
Hepsi için çift tıklayarak default metodları oluşturalım.
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Button1 Click olayında BackgroundWorker’ın işleme başlamasını sağlıyoruz.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
FTPDosyaCek();
}
DoWork olayında Dosya çekme işlemini başlatıyoruz.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
Progressbar’a yansıtıyoruz
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Dosya İndirildi.");
}
Ve işlem tamamlandı.
Şimdi uygulamayı test ediyoruz.
Evet dosyamız başarıyla indirildi.

Hakan Başar AKSAN