Загрузить файл из Интернета в локальный файл с индикатором прогресса на C#

StackOverflow https://stackoverflow.com/questions/1108292

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

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

  • Загружайте список файлов, обычно около 114
  • Запустите цикл по списку файлов и загрузите каждый из них в соответствии с его назначением

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

Это было полезно?

Решение

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

Редактировать:

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

Другие советы

Обрабатывать веб-клиент Скачиваемый процесс изменен событие.

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

Кроме того, в событии 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top