Форум программистов, компьютерный форум, киберфорум
motokraft
Войти
Регистрация
Восстановить пароль
Освоение языка программирования C#. Простые действия для создания простых программы...
Оценить эту запись

Скачивание Файла с Помощью HTTP://

Запись от motokraft размещена 10.01.2014 в 14:42

[I]Самый простой способ Скачивания Файла.[/I]
Для работы необходимо подключить библиотеку [B][I][U]using System.Net;[/U][/I][/B]
[CSHARP]WebClient webClient = new WebClient();
webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");[/CSHARP]

Скачивание Файла с Использованием [I][B]РrogressBar-а[/B][/I]
Для загрузки файла по http не блокируя при этом основного потока необходимо воспользоваться методом [URL="http://msdn.microsoft.com/ru-ru/library/ms144196.aspx"]DownloadFileAsync[/URL]. Также можно обработать событие DownloadProgressChanged для индикации процесса загрузки файла и событие DownloadFileCompleted для определения момента, когда файл будет полностью загружен.
[CSHARP]private void btnDownload_Click(object sender, EventArgs e)
{
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri("http://mysite.com/myfile.txt"), @"c:\myfile.txt");
}

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}

private void Completed(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("Download completed!");
}[/CSHARP]

[B][I]Скачка файла с отображением процесса загрузки при помощи WebRequest.[/I][/B]
Для того что бы скачать файл с помощью класса WebRequest потребуется немного больше усилий чем в способах описанных выше и особой выгоды от этого не будет, но рассмотреть их тоже стоит.

Для этого необходимо послать запрос по необходимому адресу и в ответе будет содержаться ссылка на поток с данными:
[CSHARP]HttpWebRequest _req = (HttpWebRequest) WebRequest.Create(“[url]http://mysite.com/myfile.txt”);[/url]
WebResponse _response = _req.GetResponse();
Stream _stream = _response.GetResponseStream();[/CSHARP]
[B][I]Для того что бы сохранить данные на диске необходимо в цикле прочитать содержимое потока полученного в результате выполнения запроса, например вот так:[/I][/B]
[CSHARP]FileStream _fs = new FileStream(“myfile.txt”, FileMode.Create)

int _bytesRead = 1;
while (_bytesRead != 0)
{
byte[] buffer = new byte[1024];
_bytesRead = _stream.Read(buffer, 0, buffer.Length);
_fs.Write(buffer, 0, buffer.Length);
}[/CSHARP]
[I][B]Запустив все эти действия в отдельном потоке, в основном потоке можно отображать процесс загрузки. Так как работать с визуальными компонентам инеобходимо из потока в котором они создавались, то для изменения например ProgressBar стоит воспользоваться методом Invoke():[/B][/I]
[CSHARP]public delegate void dClose();
private delegate void dProgressInit(ProgressBar aPb, Int32 aMaxValue);
private delegate void dProgressValue(ProgressBar aPb, Int32 aValue);

private void ProgressInit(ProgressBar aPb, Int32 aMaxValue)
{
aPb.Maximum = aMaxValue;
}

private void ProgressValue(ProgressBar aPb, Int32 aValue)
{
aPb.Value = aValue;
}

private void DownloadFiles()
{

HttpWebRequest _req = (HttpWebRequest)WebRequest.Create(item.Link);
WebResponse _response = _req.GetResponse();

Invoke(new dProgressInit(ProgressInit), new object[] { pbBytes,(Int32)_response.ContentLength });
Invoke(new dProgressValue(ProgressValue), new object[] { pbBytes, 0 });

using (Stream _stream = _response.GetResponseStream())
{
using (FileStream _fs = new FileStream(@"c:\test.txt",FileMode.Create))
{
int _bytesRead = 1;
while (_bytesRead != 0)
{
byte[] buffer = new byte[32768];

_bytesRead = _stream.Read(buffer, 0, buffer.Length);
_fs.Write(buffer, 0, _bytesRead);

buffer = null;

Invoke(new dProgressValue(ProgressValue), new object[] { pbBytes, pbBytes.Value + _bytesRead });
Invoke(new dClose(pbBytes.Refresh));
}
}
}
}[/CSHARP]
[I]Особое внимание в этом способе загрузки следует уделить размеру буфера (byte[] buffer = new byte[32768]; ) т.к. это влияет на скорость и качество загрузки. Чем меньше буфер, тем необходимо потратить больше ресурсов (времени) на запрос следующей части, но меньше вероятность сбоя подключения и соответственно наоборот. [/I]
Размещено в Без категории
Показов 740 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.