Перевод: Resume Support for File Downloads
При скачивании файлов с Интернета, очень неприятно, когда происходит обрыв связи и загрузка файла прерывается. После чего приходится начинать закачку заново.Здесь мы узнаем, как скачать файл частично, так что мы можем скачать большой файл легко по частям.
В примере используются классы HttpWebRequest и HttpWebResponse.
Код ниже использует FileStream, HttpWebRequest и HttpWebResponse классы и их методы. Перед тем, как создать запрос на файл, который мы хотим загрузить, мы должны удостовериться, не был ли файл, который мы собираемся скачать уже загружен частично ранее, или это первый запрос на файл. Если файл уже пытались скачивать, то мы создаем объект класса FileStream в режиме добавления, в противном случае мы создаем объект FileScream в режиме Create (создать новый). После этого мы должны узнать, сколько байт уже было загружено ранее. Для этого мы используем класс FileInfo,которым мы проверяем длину загруженного контента. Наиболее важным моментом является то, что в частичной загрузке, это прибавление уже скачанной длинны к HttpWebRequest. Это реализуется HttpWebRequest методом HttpWebRequest.AddRange (длина), который загружает содержимое начиная с указанной длины.
static void DownloadFile(string sSourceURL, string sDestinationPath) { long iFileSize = 0; int iBufferSize = 1024; iBufferSize *= 1000; long iExistLen = 0; System.IO.FileStream saveFileStream; if (System.IO.File.Exists(sDestinationPath)) { System.IO.FileInfo fINfo = new System.IO.FileInfo(sDestinationPath); iExistLen = fINfo.Length; } if (iExistLen > 0) saveFileStream = new System.IO.FileStream(sDestinationPath, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite); else saveFileStream = new System.IO.FileStream(sDestinationPath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite); System.Net.HttpWebRequest hwRq; System.Net.HttpWebResponse hwRes; hwRq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(sSourceURL); hwRq.AddRange((int)iExistLen); System.IO.Stream smRespStream; hwRes = (System.Net.HttpWebResponse)hwRq.GetResponse(); smRespStream = hwRes.GetResponseStream(); iFileSize = hwRes.ContentLength; int iByteSize; byte[] downBuffer = new byte[iBufferSize]; while ((iByteSize = smRespStream.Read(downBuffer, 0, downBuffer.Length)) > 0) { saveFileStream.Write(downBuffer, 0, iByteSize); } saveFileStream.Close(); }
В конце, наверное, стоит поставить saveFileStream.Close().
Вы правы. Спасибо
и наверное hwRes.Close();