2010-11-02 29 views
0

我需要基本的文件下載功能在我的應用程序,我不能使用WebClient.DownloadFile [1]。這(天真?)實施DownloadFile方法是否足夠?有沒有我沒有解決這個實施的陷阱?通過HTTP下載簡單文件 - 這是否足夠?

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

謝謝!

[1] .NET Framework精簡...

回答

1

您正在跟蹤totalBytesRead,但我無法在任何地方看到它。

由於Method = "GET"是默認值,我沒有看到任何特定於HTTP的內容。如果您刪除(HttpWebRequest)強制轉換和Method =行,那麼您將獲得通過其他協議(如FTP)下載的功能。目前,如果有人提供的網址不是http://,則代碼會拋出異常。

+0

'HttpWebRequest'是.Net CF中唯一支持的具體'WebRequest'實現。除此之外 - 謝謝! – 2010-11-03 09:16:54

1

響應應該具有Content-Length頭(除非內容編碼分塊=),它可以使用來驗證下載未中斷。

除此之外,你的實現看起來很好。

+0

'content-encoding'在'Headers'中似乎不可用。準確地說是 – 2010-11-04 16:05:24

+0

。這意味着內容長度標題可以安全使用。你只需要擔心,如果它的指定。 – jgauffin 2010-11-04 16:46:09