Как загрузить ZIP-файл с URL-адреса с помощью C#?


Я хочу загрузить ZIP-файл с какого-нибудь веб-адреса. Когда я открываю браузер и пишу URL, браузер сразу начинает загружать ZIP-файл. Однако я хочу автоматизировать это с помощью кода C#.

Я попробовал следующий код:

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!");
}

Похоже, что загрузка работает, но когда я проверяю загруженный файл, я нахожу его как 0 КБ.

Есть идеи, что происходит?

5 2

5 ответов:

Это работает:

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");

Как я вижу, ваш код соответствует известному Антипаттернутаймеру и сборщику мусора .

Когда btnDownload_Click заканчивается, переменная webClient становится недоступной, и сборщик мусора уничтожает ее вместе с ее функциональностью.

Попробуйте это:

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!");
}

Теперь webClient является членом класса и доступен. Тогда сборщик мусора не уничтожит его.

Вы можете легко использовать класс ZipFile следующим образом:

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");
        }
    }
Обратите внимание, что это только доступно с .Net Framework версии 4.5 и далее..

У меня тоже была эта проблема, но я нашел простое решение. я хочу загрузить этот Zip-файл из "http://sodco.ir/Choobkhat/Update/update.zip " и извлекать их. но webClient его не скачивает.

Мое Решение:

Шаг 1: измените имя файла с "D:\update.zip "to" D:\update.zi " webClient.DownloadFileAsync("http://sodco.ir/Choobkhat/Update/update.zip", "D:\\update.zi);

Он начнет загрузку, после завершения загрузки:

Шаг 2: переименовать обновление.Зи то обновление.zi p

File.Move("update.zi", "update.zip");

Шаг 3: извлеките их

ZipFile.ExtractToDirectory(Application.StartupPath + "\\update.zip", Application.StartupPath);

Рефренс

Полный пример: полный образец на .Чистая Скрипка

public static bool DownloadFile(string filenameXML){
HttpWebRequest request;
HttpWebResponse response = null;
FileStream fs = null;
long startpoint = 0;
NewSourceFilePath=filenameXML;

fs = File.Create(NewSourceFilePath);
request = (HttpWebRequest)WebRequest.Create("http://---/file.zip");
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version11;
request.Method = "GET";
request.ContentType = "gzip";
request.Timeout=10000;
request.Headers.Add("xRange", "bytes " + startpoint + "-");
response = (HttpWebResponse)request.GetResponse();
Stream streamResponse = response.GetResponseStream();
byte[] buffer = new byte[1024];
int read;
while ((read = streamResponse.Read(buffer, 0, buffer.Length)) > 0){
fs.Write(buffer, 0, read);}
fs.Flush();fs.Close();
}