Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何下载C#中的zip文件?_C#_Http_Get_Download - Fatal编程技术网

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

如何下载C#中的zip文件?,c#,http,get,download,C#,Http,Get,Download,我使用HTTP GET在浏览器中下载zip文件,类似(不是确切的url) 现在,当我尝试用C#code(与上面相同的GET方法)为桌面应用程序进行相同的下载时,下载的zip文件不是有效的存档文件。当我在记事本中打开这个文件时,它是一些HTML页面 我想我没有正确设置一些标题。我四处寻找例子。我发现了几个wrt上传,但没有看到任何下载 代码: 这主要是因为您使用StreamWriter:TextWriter来处理二进制Zip文件。StreamWriter需要文本并将应用编码。即使是简单的ASCII

我使用HTTP GET在浏览器中下载zip文件,类似(不是确切的url)

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

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

代码:


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

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

  using (var client = new WebClient())
  {
    client.DownloadFile("http://something",  @"D:\Downloads\1.zip");
  }
对于新代码,您应该查看HttpClient而不是WebClient。
然后不要使用
using(){}

您可以将其用于2行程序:

using(WebClient wc = new WebClient())
{
   wc.DownloadFile(url, @"D:\Downloads\1.zip");
}

您还可以使用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);
                  }
             }
        }
}

扩展Ruben使用的答案,您可以添加如下扩展方法:

使用System.IO;
使用System.Net.Http;
使用System.Threading.Tasks;
公共静态类扩展
{
公共静态异步任务下载文件(此HttpClient客户端,字符串地址,字符串文件名){
使用(var response=await client.GetAsync(address))
使用(var stream=await response.Content.ReadAsStreamAsync())
使用(var file=file.OpenWrite(文件名)){
stream.CopyTo(文件);
}
}
}
然后像这样使用:

var archivePath=”https://api.github.com/repos/microsoft/winget-pkgs/zipball/";
使用(var httpClient=new httpClient())
{
等待httpClient.DownloadFile(archivePath,“./repo.zip”);
}

这是一个无法使用的“它不起作用”问题。Post code,记录你在十六进制查看器中打开文件时看到的内容。哦,是的,我可以看到同样的问题。+1击败我-@Al:我用一个zip文件测试了这个问题,效果很好,你确定文件本身没有损坏吗?我想我面临的问题是服务的身份验证。然后我就可以使用网络客户端下载文件了。@HenkHolterman哦,我的天哪,这个答案帮我节省了很多时间。非常感谢你和谷歌把我带到这里。@HenkHolterman谢谢你,伙计。你救了我的命。它的工作原理很好:)简洁。我喜欢那种编程+1为you@anvarbekraupov:我正在使用
语句-lookharder@BrokenGlass,将我的降级改为+1,抱歉!
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);
                  }
             }
        }
}