2010-09-12 53 views
-2

我下載了文件的部分(圖片),然後我想將這些部分保存到一個文件中。分段文件寫入問題

問題是,第一部分被正確下載和保存(我可以看到該部分)。但是,當第二部分被保存(FileMode.Append)時,圖片似乎被破壞了。

下面的代碼:

HttpWebRequest webRequest; 
    HttpWebResponse webResponse; 
    Stream responseStream; 
    long StartPosition, EndPosition; 

     if (File.Exists(LocalPath)) 
      fileStream = new FileStream(LocalPath, FileMode.Append); 
     else fileStream = new FileStream(LocalPath, FileMode.Create); 

     webRequest = (HttpWebRequest)WebRequest.Create(FileURL); 

     webResponse = (HttpWebResponse)webRequest.GetResponse(); 
     responseStream = webResponse.GetResponseStream(); 

     StartPosition = 0; //download first 52062 bytes of the file 
     EndPosition = 52061; 

     webRequest.AddRange(StartPosition, EndPosition); 

     int SeekPosition = (int)StartPosition; 

     while ((bytesSize = responseStream.Read(Buffer, 0, Buffer.Length)) > 0) 
     { 
      lock (fileStream) 
      { 
       fileStream.Seek(SeekPosition, SeekOrigin.Begin); 
       fileStream.Write(Buffer,0, bytesSize); 
      } 

    //the Buffer.Length is 2048. 
    //When the bytes count to download is < 2048 then I decrease the Buffer.Length 
    //to prevent downloading more that 52062 bytes. 

      DownloadedBytesCount += bytesSize; 
      SeekPosition += bytesSize; 

      long TotalToDownload = EndPosition - StartPosition; 

      long bytesLeft = TotalToDownload - DownloadedBytesCount; 

      if (bytesLeft < Buffer.Length) 
       Buffer = new byte[bytesLeft]; 
     } 

當我要下載的文件的第二部分,我設置

StartPosition = 52062; 
    EndPosition = 104122; 

,再有就是我上述的問題。爲什麼文件沒有正確地被打開?

+0

「似乎被打破」是什麼意思?不要使用FileMode.Append。 – 2010-09-12 13:42:27

+0

當我在寫第二部分後嘗試打開該圖片時,我沒有看到它的內容。 – Tony 2010-09-12 13:47:06

+1

你的代碼太錯了我甚至不知道從哪裏開始。爲什麼你需要全部下載文件? – dtb 2010-09-12 13:58:15

回答

2

你不需要StartPositionfileStream.Seek()Buffer = new byte[bytesLeft];

另外,lock()不應該是必要的(如果你已經得到了很多更多的麻煩)。

因此,請刪除所有這些,因爲您有可能得到一些錯誤。

如果它仍然無法正常工作,請編輯問題並提供更多信息。現在有相當多的缺失:

  • 如果下載循環完全執行,您可以使用調試器驗證嗎?
  • 如何轉換到第二範圍52k - 104k執行
  • 最終生成的文件有多長?
  • 該文件是否包含第一個52k字節或第二個下載?

所有的事項,我們不應該去猜測。

+0

我需要Seek操作和鎖定,因爲本地文件將被許多線程訪問。我看到 - 奇怪 - 文件的第二部分與第一部分具有相同的前4096個字節。我知道服務器支持Range標頭,因爲第一部分已經正確下載。 – Tony 2010-09-12 18:49:44

+1

如果你真的在不同的線程中使用FileStream(不是:file),你不能使用Append模式。 – 2010-09-12 19:27:13

+0

好吧,我可以將它更改爲FileMode.Open – Tony 2010-09-12 19:41:41

0

什麼,我會嘗試是下載圖片的一些方式,你知道它的工作原理和比較字節結果來檢查該文件被打破,什麼是打破它...