2013-01-07 13 views
5

Sto scrivendo un programma che deve scaricare un file .exe da un sito Web e quindi salvarlo sul disco rigido. Il .exe è memorizzato sul mio sito ed è URL è la seguente (che non è il vero uri solo quello che ho fatto per lo scopo di questa domanda):Come utilizzare HttpWebRequest/Response per scaricare un file binario (.exe) da un server Web?

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

Dopo molte ricerche sul Web e armeggiando attraverso esempi qui è la codice sono venuto in mente finora:

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

Come potete vedere sto usando la classe StreamReader per leggere i dati. Dopo aver chiamato ReadToEnd il lettore di stream contiene il contenuto (binario) del mio .exe? Posso semplicemente scrivere il contenuto dello StreamReader in un file (denominato calc.exe) e avrò scaricato con successo l'exe?

Mi chiedo il motivo per cui ReadToEnd restituisce una stringa. Nel mio caso questa stringa sarebbe il contenuto binario di calc.exe?

risposta

6

StreamReader è un'implementazione di un lettore di testo, vale a dire che dovrebbe essere utilizzato per leggere dati di testo e non dati binari. Nel tuo caso, dovresti utilizzare direttamente il flusso di risposta sottostante.

Per scaricare il file, il modo più semplice sarebbe utilizzare il metodo WebClient.DownloadFile.

+0

Grazie mille! Verificherà WebClient.DownloadFile adesso! –

+0

WebClient DownloadFile ha funzionato ed erano solo 3 righe di codice! –

1

Invece di utilizzare StreamReader, è necessario chiamare il metodo Read() dell'oggetto Stream. Questo ti chiederà un buffer di byte [] da riempire con i dati letti, che potrai poi scrivere su disco usando StreamWriter o FileStream.

+0

Ho visto un esempio di qualcuno che legge lo stream utilizzando un array di byte e un loop finché non ci sono più dati. L'ho provato anche io. Ecco il ciclo che ho usato: * while ((bytesRead = responseStream.Read (buffer, 0, buffer.Length))> 0) *. È così che mi stai suggerendo di farlo? –

2

Questo dovrebbe salvare direttamente il file sul disco rigido.

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

Chiede httpwebrequests non webclient –

7

WebClient è il metodo migliore per scaricare il file. Ma puoi usare il seguente metodo per scaricare un file in modo asincrono dal server 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) 
    { 
    } 
} 

C'è un filo simile qui - How to Download the File using HttpWebRequest and HttpWebResponse class(Cookies,Credentials,etc.)

0

Probabilmente sono un po 'in ritardo ma ho avuto lo stesso problema con i file di essere sempre 0kb grande, se non in esecuzione in modalità di debug .. Questo potrebbe essere una risposta relativamente semplice, ma disabilitare "Costanti DEBUG" in Proprietà lo ha risolto per me.

Problemi correlati