2013-01-07 26 views
5

Bir web sitesinden bir .exe dosyasını indirmeniz ve ardından sabit sürücüye kaydetmeniz gereken bir program yazıyorum. .exe sitemde saklanır ve URL (ben bu sorunun amacıyla yapılmış sadece bir gerçek uri değil) aşağıdaki gibidir var:HttpWebRequest/Response Bir Web Sunucusundan İkili (.exe) Dosyayı Nasıl İndirebilirim?

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

birçok web aramaları sonra ve burada örneklerle beceriksiz olduğunu Ben şimdiye kadar ile geldi kod:

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

ben verileri okumak için StreamReader sınıfını kullanıyorum görebileceğiniz gibi. Akış okuyucusu, numaralı çağrıyı çağırdıktan sonra benim .exe'imin (ikili) içeriğini içeriyor mu? StreamReader'un içeriğini bir dosyaya (calc.exe olarak adlandırılır) yazabilir miyim ve .exe'yi başarılı bir şekilde indirmiş olabilir miyim?

Neden StreamReaderReadToEnd bir dize döndürdüğünü merak ediyorum. Benim durumumda bu dize calc.exe ikili içeriği olur mu?

cevap

6

StreamReader bir metin okuyucu uygulamasıdır, yani metin verilerini okumak ve ikili veriyi okumak için kullanılmalıdır. Durumunuzda, temeldeki yanıt akışını doğrudan kullanmalısınız.

Dosyayı indirmek için, en basit yol WebClient.DownloadFile yöntemini kullanmaktır.

+0

Harika teşekkürler! WebClient.DownloadFile hemen kontrol edecek! –

+0

WebClient DownloadFile çalıştı ve sadece 3 satır kod oldu! –

1

StreamReader kullanmak yerine, Stream nesnesinin Read() yöntemini çağırmalısınız. Bu, daha sonra StreamWriter veya FileStream kullanarak diske yazabileceğiniz, okunan verilerle doldurulacak bir bayt [] arabelleği isteyecektir.

+0

Başka bir veri bulunana kadar bir bayt dizisi ve bir döngü kullanarak akışı okuyan birinin örneğini gördüm. Ben de bunu denedim. İşte kullandığım döngü: * while ((bytesRead = responseStream.Read (buffer, 0, buffer.Length))> 0) *. Bunu yaptığın gibi mi? –

2

Bu, dosyayı doğrudan sabit diskinize kaydetmelidir.

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

Webclient değil httpwebrequests istiyor –

7

WebClient, dosyayı karşıdan yüklemek için en iyi yöntemdir. Ancak, web sunucusundan senkronize olmayan bir dosyayı indirmek için aşağıdaki yöntemi kullanabilirsiniz.

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) 
    { 
    } 
} 

Orada burada da benzer bir iplik - How to Download the File using HttpWebRequest and HttpWebResponse class(Cookies,Credentials,etc.)

0

ben biraz geç muhtemelen değilim ama dosyaları her zaman hata ayıklama modunda çalışırken değil .. Bu kudreti varsa 0kb büyük ki aynı problem vardı göreceli olarak basit bir cevap olmakla birlikte, Özellikler altında "DEBUG-Sabitler" i devre dışı bırakmak benim için çözdü.

İlgili konular