آموزش ساخت برنامه مدیریت دانلود در سی شارپ با کمک WebClient
سلام دوستان
ساخت ابجکت دانلود گر
ما به کلاس وب کلاینت نیاز داریم. این کلاس در فضای System.Net قرار دارد. پس برای استفاده از امکانات آن یک object از آن می سازیم:
WebClient downloader = new WebClient();
این کلاس دانلود را به صورت async انجام میدهد و از کرش و قفل کردن برنامه جلو گیری می کندافزودن هندلر دانلود
برای اینکه بتوانیم از پیشرفت دانلود و همچنین اتمام دانلود مطلع شویم، به ترتیب می توانیم از Handler رویدادهای DownloadProgressChangedEventHandler و AsyncCompletedEventHandler کمک بگیریم. باید کد ها را در متد Form_Load بنویسیم
private void Form1_Load(object sender, EventArgs e)
{
downloader.DownloadProgressChanged +=
new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
downloader.DownloadFileCompleted +=
new AsyncCompletedEventHandler(client_DownloadFileCompleted);
}
دو متد با نام های client_DownloadProgressChanged و client_DownloadFileCompleted به ترتیب برای مدیریت رویدادهای پیشرفت دانلود و اتمام دانلود برای شیء downloader ساخته شده اند. در داخل این متدها کدهای لازم برای محاسبات مربوط به پیشرفت دانلود و سرعت دانلود را می توان قرار داد. ابتدا به بررسی تابع client_DownloadProgressChanged می پردازیم:نوشتن متدهای هندل گر
void client_DownloadProgressChanged(object sender,
DownloadProgressChangedEventArgs e)
{
double bytesIn = double.Parse(e.BytesReceived.ToString());
double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
double percentage = bytesIn / totalBytes * 100;
txtTotal.Text =
Math.Round((decimal)(e.TotalBytesToReceive/1024),1).ToString() + " کیلوبایت";
txtDownloaded.Text =
Math.Round((decimal)(e.BytesReceived/1024),1).ToString() + " کیلوبایت";
double remain = (decimal)((e.TotalBytesToReceive - e.BytesReceived)/1024);
txtRemain.Text = Math.Round(remain,1).ToString()+" کیلوبایت";
downloadProgress.Value = int.Parse(Math.Truncate(percentage).ToString());
}
همانطور که مشاهده می کنید این متد دارای یک object با نام sender و یک DownloadProgressChangedEventArgs با نام e می باشد که حاوی دو مقدار عددی برای تعداد بایت های دریافت شده و تعداد کل بایت های فایل می باشد. به کمک همین دو عدد میتوان تغییرات را محاسبه کرد.
اما برای متد client_DownloadFileCompleted می توانیم کدهای مربوط به اتمام عملیات دانلود را بنویسیم. مثلا بعد از اتمام دانلود فایل مربوطه اجرا شود، یا پیغامی به کاربر نشان داده شود که فایل به درستی دانلود شده یا خیر و… به نمونه کد زیر دقت کنید:
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("فایل دریافت شد!");
}
مانند متد قبلی این متد هم دو آرگمان ورودی با نام های مشابه دارد. فقط در این متد نوع شیء e متفاوت است. این بار شیء e می تواند Cancel شدن یا نشدن عملیات و همچنین وقوع Error در حین دانلود را به ما نشان دهد. ما در مثال بالا هیچکدام از این حالت ها را بررسی نکرده ایم و تنها پیغامی مبتنی بر اتمام دانلود به کاربر نشان می دهیم.
نحوه دانلود فایل
در انتها برای اینکه بتوانیم فایلی را توسط downloader دریافت کنیم، باید URL فایل را به همراه مسیر ذخیره سازی به متد DownloadFileAsync بدهیم. به نمونه کد زیر دقت کنید:
string filename = "newfile.txt";
Uri filepath = new Uri("http://example.com/file.txt");
downloader.DownloadFileAsync(filepath,filename);
پایان.