2012-03-25 5 views
3

Ich versuche, eine .torrent-Datei (nicht den Inhalt des Torrents selbst) in meiner .NET-Anwendung herunterzuladen.Das Herunterladen einer Torrent-Datei mit WebClient führt zu einer beschädigten Datei.

Mit dem folgenden Code funktioniert für andere Dateien, aber nicht .torrent. Die resultierenden Dateien sind ungefähr 1-3kb kleiner als wenn ich die Datei über einen Browser herunterlade. Beim Öffnen in einem Torrent-Client heißt es, der Torrent sei beschädigt.

WebClient web = new WebClient(); 
web.Headers.Add("Content-Type", "application/x-bittorrent"); 
web.DownloadFile("http://kat.ph/torrents/linux-mint-12-gnome-mate-dvd-64-bit-t6008958/", "test.torrent"); 

Durch Öffnen der URL in einem Browser wird die Datei ordnungsgemäß heruntergeladen.

Irgendwelche Ideen, warum das passieren würde? Gibt es eine gute Alternative zum WebClient, um die Datei korrekt herunterzuladen?

EDIT: Ich habe schon versucht, diese sowie WebClient, und es ergibt sich die gleiche Sache:

private void DownloadFile(string url, string file) 
    { 
     byte[] result; 
     byte[] buffer = new byte[4096]; 

     WebRequest wr = WebRequest.Create(url); 
     wr.ContentType = "application/x-bittorrent"; 
     using (WebResponse response = wr.GetResponse()) 
     { 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       using (MemoryStream memoryStream = new MemoryStream()) 
       { 
        int count = 0; 
        do 
        { 
         count = responseStream.Read(buffer, 0, buffer.Length); 
         memoryStream.Write(buffer, 0, count); 

        } while (count != 0); 

        result = memoryStream.ToArray(); 

        using (BinaryWriter writer = new BinaryWriter(new FileStream(file, FileMode.Create))) 
        { 
         writer.Write(result); 
        } 
       } 
      } 
     } 
    } 
+0

HttpWebRequest gibt Ihnen mehr Kontrolle über Ihre Downloads ... Ich bin nicht sicher, welche Möglichkeiten Sie allerdings für einen reißenden Strom konfigurieren müssen. – McGarnagle

+0

Danke! Ich hatte das auch tatsächlich versucht, ohne Unterschied in den Ergebnissen. Ich habe diesen Code bearbeitet. Wenn Sie etwas sehen, was ich falsch gemacht habe, lassen Sie es mich wissen. – Khalos

+0

Sollte beim Herunterladen einer .torrent-Datei kein Unterschied sein, als beim Herunterladen einer anderen Binärdatei. –

Antwort

5

Das Problem, das Serverinhalt von gzip komprimiert kehrt und Sie diese komprimierte Inhalte herunterladen Datei . In solchen Fällen sollten Sie den Header "Content-Encoding" überprüfen und mit dem richtigen Stream-Reader die Quelle dekomprimieren. ich Ihre Funktion geändert komprimierte Dateien zu verarbeiten:

private void DownloadFile(string url, string file) 
    { 
     byte[] result; 
     byte[] buffer = new byte[4096]; 

     WebRequest wr = WebRequest.Create(url); 
     wr.ContentType = "application/x-bittorrent"; 
     using (WebResponse response = wr.GetResponse()) 
     { 
      bool gzip = response.Headers["Content-Encoding"] == "gzip"; 
      var responseStream = gzip 
            ? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress) 
            : response.GetResponseStream(); 

      using (MemoryStream memoryStream = new MemoryStream()) 
      { 
       int count = 0; 
       do 
       { 
        count = responseStream.Read(buffer, 0, buffer.Length); 
        memoryStream.Write(buffer, 0, count); 
       } while (count != 0); 

       result = memoryStream.ToArray(); 

       using (BinaryWriter writer = new BinaryWriter(new FileStream(file, FileMode.Create))) 
       { 
        writer.Write(result); 
       } 
      } 
     } 
    } 
+0

Danke! Das funktioniert perfekt. Sollte an Kompression gedacht haben! – Khalos

+0

Ich habe ein ähnliches Problem. Ich benutze Python (urllib2.urlopen) ... Wie überprüfe ich die Kodierung und entzippe die Datei in Python? Vielen Dank – koogee

Verwandte Themen