How can I download a ZIP file from a URL using C#?

17,039

Solution 1

This works:

WebClient webClient = new WebClient();
webClient.Headers.Add("Accept: text/html, application/xhtml+xml, */*");
webClient.Headers.Add("User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
 webClient.DownloadFileAsync(new Uri("https://www.nseindia.com/content/historical/DERIVATIVES/2016/AUG/fo05AUG2016bhav.csv.zip"),"test1.zip");

Solution 2

As I can see, your code corresponds to known antipattern Timer and Garbage Collector.

When btnDownload_Click is finished, the webClient variable becomes unreachable, and the garbage collector destroys it together with its functionality.

Try this:

private WebClient webClient = null;

private void btnDownload_Click(object sender, EventArgs e) {
  // Is file downloading yet?
  if (webClient != null)
    return;

  webClient = new WebClient();
  webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
  webClient.DownloadFileAsync(new Uri("http://---/file.zip"), @"c:\file.zip");
}     

private void Completed(object sender, AsyncCompletedEventArgs e) {
  webClient = null;
  MessageBox.Show("Download completed!");
}

Now `webClient is the member of the class and is reachable. Then the garbage collector will not destroy it.

Solution 3

You could easily use the ZipFile class like this:

using System.IO.Compression;

    class Program
    {
        static void Main()
        {
        // Create a ZIP file from the directory "source".
        // ... The "source" folder is in the same directory as this program.
        // ... Use optimal compression.
        ZipFile.CreateFromDirectory("source", "destination.zip",
            CompressionLevel.Optimal, false);

        // Extract the directory we just created.
        // ... Store the results in a new folder called "destination".
        // ... The new folder must not exist.
        ZipFile.ExtractToDirectory("destination.zip", "destination");
        }
    }

Please note that this is only available from .Net Framework version 4.5 onwards..

Share:
17,039

Related videos on Youtube

Manoj Savalia
Author by

Manoj Savalia

Updated on June 06, 2022

Comments

  • Manoj Savalia
    Manoj Savalia almost 2 years

    I want to download a ZIP file from some web URL. When I open the browser and write the URL, the browser directly start downloading the ZIP file. However what I want is to automate this using C# code.

    I have tried the following code:

    private void btnDownload_Click(object sender, EventArgs e) {
      WebClient webClient = new WebClient();
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadFileAsync(new Uri("http://---/file.zip"), @"c:\file.zip");
    }     
    
    private void Completed(object sender, AsyncCompletedEventArgs e) {
      MessageBox.Show("Download completed!");
    }
    

    It seems that the download is working, but when I check the downloaded file I find it as 0 KB.

    Any idea what's going on?

    • GauravKP
      GauravKP over 7 years
      Confirm if the download link is not blocked in the Firewall
    • Manoj Savalia
      Manoj Savalia over 7 years
      When i write link in browser that time is work... So i think it is not blocked.
    • Alex K.
      Alex K. over 7 years
      1) Examine e.Error in Completed(). 2) Write access to the root of C: will be denied by default. 3) Compare the working request and WebClient request using Fiddler, paying attention to the HTTP headers sent in the former.
    • GauravKP
      GauravKP over 7 years
      The above code is correct, unless you have Permission restriction for download location.
    • M. A. Kishawy
      M. A. Kishawy over 7 years
      Did you try it with another URL? Maybe some local URL and see if that works.
  • Manoj Savalia
    Manoj Savalia over 7 years
    This code gives error "The remote server returned an error: (403) Forbidden."
  • Alex K.
    Alex K. over 7 years
    Why would this work when DownloadFileAsync does not?
  • Manoj Savalia
    Manoj Savalia over 7 years