2013-01-07 29 views
5

我正在编写一个程序,需要从网站下载一个.exe文件,然后将其保存到硬盘驱动器。该.exe存储在我的网站,它的网址如下(它不只是一个我提出了对这个问题的目的,真正的URI):如何使用HttpWebRequest/Response从Web服务器下载二进制(.exe)文件?

http://www.mysite.com/calc.exe 

许多网络搜索后,并通过实例摸索这里是代码我想出迄今:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(http://www.mysite.com/calc.exe); 
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 
Stream responseStream = webResponse.GetResponseStream();    
StreamReader streamReader = new StreamReader(responseStream); 
string s = streamReader.ReadToEnd(); 

正如你可以看到我现在用的是StreamReader类读取数据。在调用ReadToEnd流读取器是否包含我的.exe的(二进制)内容?我能否将StreamReader的内容写入文件(名为calc.exe),我将成功下载.exe文件?

我想知道为什么StreamReaderReadToEnd返回一个字符串。在我的情况下,这个字符串是calc.exe的二进制内容吗?

回答

6

StreamReader是一个文本阅读器的实现,即它应该用来读取文本数据而不是二进制数据。在你的情况下,你应该直接使用底层的响应流。

对于下载文件,最简单的方法是使用WebClient.DownloadFile方法。

+0

非常感谢!将立即检查WebClient.DownloadFile! –

+0

WebClient DownloadFile工作,它只有3行代码! –

1

而不是使用StreamReader,你应该真的叫Read()方法你的Stream对象。这将要求你用一个byte []缓冲区填充读取数据,然后你可以使用StreamWriterFileStream写入磁盘。

+0

我看到一个人用一个字节数组和一个循环读取流的例子,直到没有更多的数据。我其实也试过了。这是我使用的循环:* while((bytesRead = responseStream.Read(buffer,0,buffer.Length))> 0)*。这是你建议我这样做的方式吗? –

2

这应该直接将文件保存在硬盘上。

using System.Net; 
using (WebClient webClient = new WebClient()) 
{ 
    webClient.DownloadFile("http://www.mysite.com/calc.exe", "calc.exe"); 
} 
+9

他要求httpwebrequests不是webclient –

7

WebClient是下载文件的最佳方法。但是您可以使用以下方法从Web服务器异步下载文件。

private static void DownloadCurrent() 
{ 
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("[url to download]"); 
    webRequest.Method = "GET"; 
    webRequest.Timeout = 3000; 
    webRequest.BeginGetResponse(new AsyncCallback(PlayResponeAsync), webRequest); 
} 

private static void PlayResponeAsync(IAsyncResult asyncResult) 
{ 
    int total = 0; 
    int received = 0; 
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

    try 
    {      
     using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) 
     { 
      byte[] buffer = new byte[1024]; 

      FileStream fileStream = File.OpenWrite("[file name to write]"); 
      using (Stream input = webResponse.GetResponseStream()) 
      {   
       total = input.Length; 

       int size = input.Read(buffer, 0, buffer.Length); 
       while (size > 0) 
       { 
        fileStream.Write(buffer, 0, size); 
        received += size; 

        size = input.Read(buffer, 0, buffer.Length); 
       } 
      } 

      fileStream.Flush(); 
      fileStream.Close(); 
     }     
    } 
    catch (Exception ex) 
    { 
    } 
} 

这里有一个类似的话题 - How to Download the File using HttpWebRequest and HttpWebResponse class(Cookies,Credentials,etc.)

0

我可能有点晚,但我有文件是始终如果在调试模式下运行..这可能0KB大同样的问题是一个相对简单的答案,但禁用属性下的“DEBUG-Constants”为我解决了它。

相关问题