Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / ASP.NET

Resume Support for File Downloads

4.81/5 (35 votes)
9 Jul 2012CPOL1 min read 102.1K   3.5K  
Partial downloading of files.

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…

C#
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);
    }
}  

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)