ساخت مدیر دانلود فایل در سی شارپ 4/5 (1)

9
559
visual studio

در این آموزش میخواهیم به کمک کلاس WebClient یک برنامه دانلود فایل ساده بسازیم. این برنامه می تواند آدرس اینترنتی فایل یا همان URL را بگیرد و سپس اقدام به دانلود فایل کند. در ضمن میزان پیشرفت دانلود و همچنین سرعت دانلود نیز محاسبه شده و به کاربر نمایش داده می شود.

دانلود

[divider]

ایجاد Object دانلود کننده

همانطور که در ابتدای آموزش نیز بیان شد، به کلاس WebClient نیاز داریم. این کلاس در کتابخانه System.Net موجود است. پس برای استفاده از امکانات آن یک object از آن می سازیم:

 WebClient downloader = new WebClient(); 

[divider]

افزودن Handler های دانلود

این کلاس می تواند دانلود فایل را بصورت غیر همزمان انجام دهد. منظور از غیر همزمان یا Async این است که عملیات دانلود در یک Thread جدا از برنامه اصلی اجرا می شود و در نتیجه، هنگام دانلود فایل فرم اصلی برنامه هنگ نمی کند و می توان از سایر امکانات برنامه استفاده نمود.

برای اینکه بتوانیم از پیشرفت دانلود و همچنین اتمام دانلود مطلع شویم، به ترتیب می توانیم از 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);
}

کدنویسی متدهای Handle کننده

همانطور که در کد بالا می بینید، دو متد با نام های 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 می باشد که حاوی دو مقدار عددی برای تعداد بایت های دریافت شده و تعداد کل بایت های فایل می باشد. به کمک همین دو عدد میتوان تغییرات را محاسبه کرد.

[divider]

اما برای متد client_DownloadFileCompleted می توانیم کدهای مربوط به اتمام عملیات دانلود را بنویسیم. مثلا بعد از اتمام دانلود فایل مربوطه اجرا شود، یا پیغامی به کاربر نشان داده شود که فایل به درستی دانلود شده یا خیر و… به نمونه کد زیر دقت کنید:


void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("فایل دریافت شد!");
}

مانند متد قبلی این متد هم دو آرگمان ورودی با نام های مشابه دارد. فقط در این متد نوع شیء e متفاوت است. این بار شیء e می تواند Cancel شدن یا نشدن عملیات و همچنین وقوع Error در حین دانلود را به ما نشان دهد. ما در مثال بالا هیچکدام از این حالت ها را بررسی نکرده ایم و تنها پیغامی مبتنی بر اتمام دانلود به کاربر نشان می دهیم.

[divider]

نحوه دانلود فایل

در انتها برای اینکه بتوانیم فایلی را توسط downloader دریافت کنیم، باید URL فایل را به همراه مسیر ذخیره سازی به متد DownloadFileAsync بدهیم. به نمونه کد زیر دقت کنید:


string filename = "newfile.txt";

Uri filepath = new Uri("http://example.com/file.txt");
downloader.DownloadFileAsync(filepath,filename);

موفق و پیروز باشید!
همچنین می توانید نمونه پروژه مربوط به این آموزش را دانلود نمایید:
پسورد فایل: www.myempire.ir

دریافت نمونه پروژه

به این مطلب امتیاز بدهید

9 دیدگاه‌ها

  1. د.
    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());

    درکد با لا
    txtTotal.Text = ؟
    txtDownloaded.Text =؟
    txtRemain.Text = ؟
    txtSpeed.Text =؟
    چی هستند ؟

  2. //
    // txtTotal
    //
    this.txtTotal.BorderStyle = System.Windows.Forms.BorderStyle.None;
    this.txtTotal.Location = new System.Drawing.Point(187, 117);
    this.txtTotal.Name = “txtTotal”;
    this.txtTotal.ReadOnly = true;
    this.txtTotal.Size = new System.Drawing.Size(74, 14);
    this.txtTotal.TabIndex = 6;
    //
    // txtDownloaded
    //
    this.txtDownloaded.BorderStyle = System.Windows.Forms.BorderStyle.None;
    this.txtDownloaded.Location = new System.Drawing.Point(187, 149);
    this.txtDownloaded.Name = “txtDownloaded”;
    this.txtDownloaded.ReadOnly = true;
    this.txtDownloaded.Size = new System.Drawing.Size(74, 14);
    this.txtDownloaded.TabIndex = 7;
    //
    // txtRemain
    //
    this.txtRemain.BorderStyle = System.Windows.Forms.BorderStyle.None;
    this.txtRemain.Location = new System.Drawing.Point(16, 117);
    this.txtRemain.Name = “txtRemain”;
    this.txtRemain.ReadOnly = true;
    this.txtRemain.Size = new System.Drawing.Size(100, 14);
    this.txtRemain.TabIndex = 8;

    BorderStyle =؟

  3. 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());

    درکد با لا
    txtTotal.Text = ؟
    txtDownloaded.Text =؟
    txtRemain.Text = ؟
    txtSpeed.Text =؟
    چی هستند ؟

  4. سلام صبح جمعه تان بخیر متشکر از زحمات شم. مشکل بالا را پیدا کردم ومشکلم حل شد منتها این برنامه نسبت به دانلود منجر خیلی کند است اما در اجرا مشکل ندارد

ارسال یک پاسخ

لطفا دیدگاه خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید