如何在 C# 中下载 zip 文件?

Posted

技术标签:

【中文标题】如何在 C# 中下载 zip 文件?【英文标题】:How do I download zip file in C#? 【发布时间】:2011-01-22 16:28:42 【问题描述】:

我使用 HTTP GET 在浏览器中下载 zip 文件,例如 https://example.com/up/DBID/a/rRID/eFID/vVID(不是确切的 url)

现在,当我尝试使用 C# 代码(与上述相同的 GET 方法)为桌面应用程序进行相同的下载时,下载的 zip 文件不是有效的存档文件。当我在记事本中打开这个文件时,它是一些 html 页面。

我认为我没有正确设置一些标题。我四处寻找例子。我发现了几个 wrt 上传,但没有看到任何下载内容。

代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/zip";
try

    HttpWebResponse res = (HttpWebResponse)request.GetResponse();
    using (StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default))
    
        StreamWriter oWriter = new StreamWriter(@"D:\Downloads\1.zip");
        oWriter.Write(sr.ReadToEnd());
        oWriter.Close();
    
    res.Close();

catch (Exception ex)


【问题讨论】:

这是一个无法猜测的“它不起作用”的问题。发布代码,记录您在十六进制查看器中打开文件时看到的内容。 【参考方案1】:

这主要是因为您使用StreamWriter : TextWriter 来处理二进制Zip 文件。 StreamWriter 需要文本并将应用编码。甚至简单的 ASCII 编码器也可能会尝试“修复”它认为无效的行尾。

您可以将所有代码替换为:

  using (var client = new WebClient())
  
    client.DownloadFile("http://something",  @"D:\Downloads\1.zip");
  

Note 对于新代码,您应该查看 HttpClient 而不是 WebClient。 然后不要使用using( )

【讨论】:

哦,是的,我可以在那里看到同样的问题。 +1 击败了我 - @Al:我用一个 zip 文件对此进行了测试,它工作得很好,你确定文件本身没有损坏吗? 我认为我面临的问题是对服务的身份验证。然后我可能会使用 webclient 来下载文件。 @HenkHolterman 哦,我亲爱的上帝,这个答案让我如此节省了很多时间。非常感谢你和谷歌把我带到这里来。 @HenkHolterman 谢谢好友。你救了我的命。它工作正常:)【参考方案2】:

你可以只使用WebClient 2 线:

using(WebClient wc = new WebClient())

   wc.DownloadFile(url, @"D:\Downloads\1.zip");

【讨论】:

简短而简单。我喜欢这样的编程。为你 +1 @anvarbekraupov:我正在使用using 声明 - 仔细观察 @BrokenGlass,将我的降级替换为 +1,抱歉!【参考方案3】:

你也可以使用 System.Net.Http.HttpClient

using (HttpClient client = new HttpClient())

        using (HttpResponseMessage response = await client.GetAsync(downloadURL))
        
             using(var stream = await response.Content.ReadAsStreamAsync())
             
                  using(Stream zip = FileManager.OpenWrite(ZIP_PATH))
                  
                       stream.CopyTo(zip);
                  
             
        

【讨论】:

【参考方案4】:

扩展使用 HttpClient instead of WebClient 的 Ruben 的答案,您可以像这样添加为扩展方法:

using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

public static class Extensions

    public static async Task DownloadFile (this HttpClient client, string address, string fileName) 
        using (var response = await client.GetAsync(address))
        using (var stream = await response.Content.ReadAsStreamAsync())
        using (var file = File.OpenWrite(fileName)) 
            stream.CopyTo(file);
        
    

然后像这样使用:

var archivePath = "https://api.github.com/repos/microsoft/winget-pkgs/zipball/";
using (var httpClient = new HttpClient())

    await httpClient.DownloadFile(archivePath, "./repo.zip");

【讨论】:

以上是关于如何在 C# 中下载 zip 文件?的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何获取程序的当前文件夹名称并将zip文件解压到当前文件夹? [复制]

如何在 C# 中的 WinRAR、7Zip、Zip、Tar、Winzip 中检查文件是不是存在

如何在 C# 中解压缩多层 zip 文件

如何在c#中解压.zip文件而不解压到新位置

7zip:在C#中,如何将不同目录下的多个同名文件添加到同一个zip文件中?

如何在 C# 中异步提取 zip 文件以不阻塞 UI?