2010-11-02 8 views
0

J'ai besoin de capacités basiques de téléchargement de fichiers dans mon application et je ne peux pas utiliser WebClient.DownloadFile [1]. Cette implémentation (naïve?) D'une méthode DownloadFile suffit-elle? Y a-t-il des pièges que je n'aborde pas avec cette implémentation?Téléchargement de fichier simple via HTTP - est-ce suffisant?

public static void DownloadFile(String url, String destination) 
{ 
    using (var request = (HttpWebRequest)WebRequest.Create(url)) 
    { 
     request.Method = "GET"; 
     request.Timeout = 100000; // 100 seconds 

     using (var response = request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       using (var fileStream = File.Open(destination, 
                FileMode.Create, 
                FileAccess.Write, 
                FileShare.None)) 
       { 
        var MaxBytesToRead = 10 * 1024; 
        var buffer = new Byte[MaxBytesToRead]; 
        var totalBytesRead = 0; 
        var bytesRead = responseStream.Read(buffer, 
                 0, 
                 MaxBytesToRead); 

        while (bytesRead > 0) 
        { 
         totalBytesRead += bytesRead; 
         fileStream.Write(buffer, 0, bytesRead); 
         bytesRead = responseStream.Read(buffer, 
                 0, 
                 MaxBytesToRead); 
        } 
       } 
      } 
     } 
    } 
} 

Merci!

[1] .Net Compact Framework ...

Répondre

1

Vous gardez la trace de totalBytesRead, mais je ne peux pas le voir utilisé n'importe où. Comme Method = "GET" est la valeur par défaut, je ne vois rien de spécifique à HTTP. Si vous supprimez la distribution (HttpWebRequest) et la ligne Method =, vous pourrez télécharger d'autres protocoles, tels que FTP. Actuellement le code lèvera une exception si quelqu'un fournit une URL autre que http: //.

+0

'HttpWebRequest' est la seule implémentation' WebRequest' concrète prise en charge dans .Net CF. Autre que cela - merci! –

1

réponse devrait avoir un en-tête Content-Length (à moins de codage de contenu = chunked) que vous pouvez utiliser pour valider que le téléchargement n'a pas été interrompue.

À part cela, votre implémentation me convient parfaitement.

+0

'content-encoding' ne semble pas être disponible parmi les' Headers'. –

+0

exactement. Cela signifie que l'en-tête content-length est sûr à utiliser. Vous devez seulement vous inquiéter si c'est spécifié. – jgauffin

Questions connexes