Загрузить файл из Интернета в локальный файл с индикатором прогресса на C#
Вопрос
У меня есть небольшое приложение, которое загружает некоторые файлы с удаленного сервера (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.