Скачать файл из Интернета в локальный файл с индикатором прогресса в C # - PullRequest
3 голосов
/ 10 июля 2009

У меня есть небольшое приложение, которое загружает некоторые файлы с удаленного (HTTP) сервера на локальный жесткий диск пользователя, некоторые файлы имеют большой размер, но я не знаю, насколько они велики во время выполнения. Есть ли способ, который позволит мне загрузить файл с индикатором прогресса какого-либо типа?

Это приложение WinForms, сейчас я использую WebClient.DownloadFile () для загрузки файла.

Edit: Я посмотрел на события DownloadProgressChanged и OnDownloadProgressChanged, и они, кажется, работают нормально, но они не будут работать для моего решения. Я загружаю несколько файлов, и если я использую WebClient.DownloadFileAsync, событие вызывается несколько раз в секунду, потому что каждый файл вызывает его.
Вот основная структура приложения:

  • Скачать список файлов обычно около 114
  • Выполнить цикл по списку файлов и загрузить каждый файл по назначению

Я не против загружать каждый файл отдельно, но без загрузки их с помощью DownloadFileAsync () я не могу использовать обработчики событий.

Ответы [ 4 ]

5 голосов
/ 10 июля 2009

Использовать WebClient.OnDownloadProgressChanged . Имейте в виду, что рассчитать прогресс можно только в том случае, если сервер сообщает размер заранее.

РЕДАКТИРОВАТЬ:

Глядя на ваше обновление, вы можете создать очередь URL-адресов. Затем, когда загрузка файла завершится (событие DownloadDataCompleted ), вы запустите асинхронную загрузку следующего URL-адреса в очереди. Я не проверял это.

2 голосов
/ 10 июля 2009

Обработка события WebClient DownloadProgressChanged .

1 голос
/ 12 октября 2009

Мне нужно было решить аналогичную проблему, и пример кода GenericTypeTea добился цели; за исключением того, что я обнаружил, что событие DownloadDataCompleted не вызывается при вызове метода DownloadFileAsync. Вместо этого возникает событие DownloadFileCompleted.

1 голос
/ 10 июля 2009

Я только что написал это, и он определенно делает то, что вы хотите.

Кроме того, в рамках события ProgressChanged у вас есть свойство "TotalBytesToReceive" и свойство "BytesReceived".

private void StartDownload()
{

    // Create a new WebClient instance.
    WebClient myWebClient = new WebClient();

    // Set the progress bar max to 100 for 100%
    progressBar1.Value = 0;
    progressBar1.Maximum = 100;

    // Assign the events to capture the progress percentage
    myWebClient.DownloadDataCompleted+=new DownloadDataCompletedEventHandler(myWebClient_DownloadDataCompleted);
    myWebClient.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(myWebClient_DownloadProgressChanged);

    // Set the Uri to the file you wish to download and fire it off Async
    Uri uri = new Uri("http://external.ivirtualdocket.com/update.cab");
    myWebClient.DownloadFileAsync(uri, "C:\\Update.cab");

}

void myWebClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

void myWebClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    progressBar1.Value = progressBar1.Maximum;
}
...