2013-01-07 28 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」爲我解決了它。

相關問題