Освоение языка программирования C#. Простые действия для создания простых программы...
Скачивание Файла с Помощью HTTP://
Запись от motokraft размещена 10.01.2014 в 14:42
Показов 2805
Комментарии 0
|
[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] |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


