How can I download a ZIP file from a URL using C#?
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..
Related videos on Youtube
Manoj Savalia
Updated on June 06, 2022Comments
-
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 over 7 yearsConfirm if the download link is not blocked in the Firewall
-
Manoj Savalia over 7 yearsWhen i write link in browser that time is work... So i think it is not blocked.
-
Alex K. over 7 years1) Examine
e.Error
inCompleted()
. 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 over 7 yearsThe above code is correct, unless you have Permission restriction for download location.
-
M. A. Kishawy over 7 yearsDid you try it with another URL? Maybe some local URL and see if that works.
-
-
Manoj Savalia over 7 yearsThis code gives error "The remote server returned an error: (403) Forbidden."
-
Alex K. over 7 yearsWhy would this work when DownloadFileAsync does not?
-
Manoj Savalia over 7 yearsI want download file from "nseindia.com/content/historical/DERIVATIVES/2016/AUG/…"