2010-09-12 63 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

什么,我会尝试是下载图片的一些方式,你知道它的工作原理和比较字节结果来检查该文件被打破,什么是打破它...