C# Asenkron Dosya Yükleme

C# Asenkron Dosya Yükleme

C# Asenkron Dosya Yükleme

  6 dakika Okuma Süresi
Merhabalar, C# derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde FTP'ye asenkron olarak dosya yüklemeyi anlatacağım. Hadi başlayalım !

Daha önce FTP'ye dosya yüklemeyle alakalı iki yazı yazmıştık ve birinde WebClient diğerinde ise FtpWebRequest kullandık (WebClient yazımız için buraya, FtpWebRequest yazımız için ise buraya tıklayabilirsiniz) fakat her iki yöntemde de dosya senkron olarak yükleniyor, yani dosya yüklenirken başka bir işlem yapamazsınız ve eğer ki yükleyeceğiniz dosyanın boyutu büyük ise uygulama, dosya yüklenene kadar donacaktır. Bu kullanıcılar için sorun olabilir, yani sonuçta örneğin ben kullanıcı olsam ve 1 gb gibi bi dosyayı yüklerken uygulamanın cevap vermemesi ve donması canımı sıkardı.
İşte bu yazımızda bu sorunu çözeceğiz, yani asenkron yükleme yapacağız ve dosya yüklenirken istersek başka işlerimizi de yapabileceğiz.

Bunun için de yine WebClient sınfını kullanacağız ve elbette bu sınıfı kullanabilmek için bulunduğu kütüphaneyi yani System.Net kütüphanesini proje sayfamızda çağıralım. Bunun için sayfanın en başına
using System.Net;
kod satırını ekleyelim.
Şimdi de WebClient sınıfından yeni bir nesne türetmemiz gerekiyor ve constructor yani yapıcı metod herhangi bir parametre istememekte. Hemen yeni bir nesne türetelim;
WebClient client = new WebClient();
FTP'ye dosya yükleyebilmek için sunucuya giriş yapmamız ve sonrasında da dosyayı yüklememiz gerekiyor.
Türettiğimiz client nesnesi üzerinden sunucuya giriş yapabilmek için Credentials propertisini kullanacağız ve veri olarakta yeni bir NetworkCredential sınıfı nesnesi istiyor. Bu sınıfın nesnesini türetmek için de kullanıcı adı ve şifre bilgilerini string tipte parametre olarak göndermemiz gerek.
client.Credentials = new NetworkCredential("kullanıcı adı", "şifre");
Sunucuya giriş bilgilerimizi de belirttik, artık dosya yükleyebiliriz.
Asenkron yükleme yapabilmek için client nesnesi altında bulunan UploadFileAsync() fonksiyonunu kullanacağız ve bu fonksiyonda Uri tipte dosyanın sunucudaki adresi ve string tipte dosyanın lokaldeki adresi olmak üzere 2 parametre istiyor ve void tipte olduğu için geriye herhangi bir şey döndürmüyor.
Dosyanın sunucudaki adresi ftp:// ile başlamalı, çünkü sonuçta FTP işlemi yapıyoruz, o yüzden adres belirtirken de FTP adresi olduğunu söylememiz gerekiyor.
Örneğin masaüstünde bulunan deneme.txt isimli dosyayı site.com/dosyalar/deneme.txt olarak sunucuya yükleyelim.
client.UploadFileAsync(new Uri("ftp://site.com/dosyalar/deneme.txt"), "c:/users/kullanici/desktop/deneme.txt");
Asenkron olarak dosya yüklemenin güzel yanı dosya yüklenirken ne kadar yüklendiğini ve yüklemenin tamamlandığını görebiliyoruz.
Dosyanın ne kadar yüklendiğini UploadProgressChanged eventi ile, dosyanın yüklendiğini ise UploadFileCompleted eventi ile görebiliyoruz.

Öncelikle UploadProgressChanged eventinden bahsedelim. Az öncede dediğim gibi bu event ile yüklemenin şu anda ne alemde olduğunu görebiliyoruz. Elbette olay yönlendirici olduğu için object ve UploadProgressChangedEventArgs nesnesi olmak üzere 2 tane parametre alıyor.
object nesnesi ilgili WebClient nesnesini, UploadProgressChangedEventArgs nesnesi ise yükleme detaylarını bildiriyor.
Örnek bi event oluşturalım.
client.UploadProgressChanged += (o, e) => { }
Şimdi e nesnesi içerisinde bulunan propertilere bi bakalım;
BytesReceived: Yükleme esnasında size gelen veriyi belirtir, long tipinde değer verir,
BytesSent: Gönderilen veriyi belirtir, long tipinde değer verir,
ProgressPercentage: Yüklemenin yüzde kaçının tamamlandığını bildirir, int tipinde değer verir,
TotalBytesToReceive: Birden fazla yükleme yapıyorsanız tüm yüklemelerde alınan verinin toplamını bildirir, long tipinde değer verir,
TotalBytesToSend: Birden fazla yükleme yapıyorsanız tüm yüklemelerde gönderilen verinin toplamını bildirir, long tipinde değer verir,
UserState: Yükleme ile ilgili kullanıcı durumunu bildirir, object tipinde değer verir.

Şimdi de UploadFileCompleted eventine bakalım.
Bu eventte yükleme işlemi tamamlanınca tetiklenir, yani yüklemenin bittiğini bildirir. Ve tabi olay yönlendirici olduğu için object ve UploadFileCompletedEventArgs nesnesi olmak üzere 2 parametre alıyor.
object o anki WebClient nesnesini, UploadFileCompletedEventArgs nesnesi ise yüklemenin detaylarını bildiriyor.
Örnek bir event oluşturalım;
client.UploadFileCompleted += (a, b) => { }
Şimdi b nesnesi içerisinde bulunan propertilere bi bakalım;
Cancelled: Yükleme işleminin kullanıcı tarafından iptal edilip edilmediğini bildirir, bool tipinde değer verir,
Error: Yükleme esnasında herhangi bir yükleme hatası oluşursa, oluşan hatanın detaylarını bildirir, Exception tipinde veri verir,
Result: Yükleme tamamlanınca sunucu tarafından gönderilen (gönderilirse tabi) veriyi bildirir, byte dizisi tipinde veri verir,
UserState: Yükleme ile ilgili kullanıcı durumunu bildirir, object tipinde değer verir.

Örneğin yükleme esnasında kullanıcıya dosyanın ne kadarı ve yüzde kaçının yüklendiğini, yükleme bittikten sonra da bittiğine dair bildiri gönderebilirsiniz.
Bu tip senaryolar sizin hayal gücünüze kalmış, artık nasıl şeyler yapmak istediğiniz size kalmış :)

Evet bu dersimizde bu kadardı, yazdığımız tüm kodları ve ek olarak yükleme devam ederken yüzde kaç yüklendiğini ProgressBar'da gösteren ve yükleme tamamlanınca da MessageBox ile kullanıcıya gönderen bi kod bloğunu aşağıya bırakıyorum;

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("kullanıcı adı", "şifre");
client.UploadProgressChanged += (o, e) =>
{
    progressBar1.Value = e.ProgressPercentage;
}
client.UploadFileComplete += (a, b) =>
{
    MessageBox.Show("Yükleme Başarıyla Tamamlandı !");
}
client.UploadFileAsync(new Uri("ftp://site.com/dosyalar/deneme.txt"), "c:/users/kullanici/desktop/deneme.txt");
Tüm C# derslerimize buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.


İÇERİĞİ DEĞERLENDİR

Toplam Değerlendirme Sayısı: 0
Toplam Değerlendirme: 0 / 5

Cevap Yaz