As we all know, downloading a file from a website is done by the click on a link, but if we want to develop an application which downloads a list of files for us, we use a web request to download files. But due to network interruptions, downloading a file is a problem when the size of the file is large. Here we will learn how to download a file partially so that the we can download a big file easily in parts.
This process uses the HttpWebRequest
and HttpWebResponse
classes of .NET.
The below code uses the FileStream
, HttpWebRequest
, and HttpWebResponse
classes and their methods. Before we create a request for the file we want to download, we should know if the file which we are going to download has already been downloaded previously or if this is the first request. If already downloaded, then we create an object of the FileStream
class with Append
mode otherwise we create an object of FileScream
with Create
mode. After that we are required to know how much content has been downloaded already. For this, we use the FileInfo
class from which we check the length of the downloaded content. The most important point is that in partial downloading, the length is required to add to our HttpWebRequest
by the method HttpWebRequest.AddRange(length)
which downloads content after the existing length…
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);
}
}