2012-11-26 63 views
2

我需要下載一些大於25 MB的文件,但我的網絡只允許請求25 MB的文件。在C中以小塊文件下載大文件#

我使用下面的代碼

const long DefaultSize = 26214400; 
    long Chunk = 26214400; 
    long offset = 0; 
    byte[] bytesInStream; 
    public void Download(string url, string filename) 
    { 
     long size = Size(url); 
     int blocksize = Convert.ToInt32(size/DefaultSize); 
     int remainder = Convert.ToInt32(size % DefaultSize); 
     if (remainder > 0) { blocksize++; } 

     FileStream fileStream = File.Create(@"D:\Download TEST\" + filename); 
     for (int i = 0; i < blocksize; i++) 
     { 
      if (i == blocksize - 1) 
      { 
       Chunk = remainder; 

      } 

      HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(url); 
      req.Method = "GET"; 
      req.AddRange(Convert.ToInt32(offset), Convert.ToInt32(Chunk+offset)); 
      HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
      // StreamReader sr = new StreamReader(resp.GetResponseStream()); 


      using (Stream responseStream = resp.GetResponseStream()) 
      { 
       bytesInStream = new byte[Chunk]; 
       responseStream.Read(bytesInStream, 0, (int)bytesInStream.Length); 
       // Use FileStream object to write to the specified file 
       fileStream.Seek((int)offset, SeekOrigin.Begin); 
       fileStream.Write(bytesInStream,0, bytesInStream.Length); 
      } 
      offset += Chunk; 

     } 
     fileStream.Close(); 

    } 
    public long Size(string url) 
    { 
     System.Net.WebRequest req = System.Net.HttpWebRequest.Create(url); 
     req.Method = "HEAD"; 
     System.Net.WebResponse resp = req.GetResponse(); 
     resp.Close(); 
     return resp.ContentLength; 

    } 

它是正確寫在磁盤上,但內容的內容不工作

+0

我真的不能提供答案,但你可以單步執行代碼?我建議縮小所有數字(例如,設置最大塊大小爲10個字節,下載文件大小爲25個字節),然後逐步完成。如果涉及較小的塊,則可能更容易發現哪裏出錯。 – PeteH

+0

你有沒有得到任何最終的解決方案,並***工作***?有了答案:'它仍然無法正常工作'你說 – Kiquenet

回答

4

你應該檢查多少寫之前讀,這樣的事情(而你不知道噸需要記住偏移尋求,尋道是自動的,當你寫):

int read; 
do 
{ 
    read = responseStream.Read(bytesInStream, 0, (int)bytesInStream.Length); 
    if (read > 0) 
     fileStream.Write(bytesInStream, 0, read); 
} 
while(read > 0); 
+0

謝謝,但它仍然無法正常工作 –

0

範圍是從零開始的,你應該從上限減去1。

request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(offset, chunkSize + offset - 1); 

我發表在以下鏈接正確的代碼片段: https://stackoverflow.com/a/48019611/1099716