分段文件写入的问题

我下载文件的部分(图片),然后我想将这些部分保存到一个文件中。

问题是,第一部分正在下载并正确保存(我可以看到该部分的pricture)。 但是,当第二部分被保存(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; 

然后有一个我上面描述的问题。 为什么文件没有正确附加?

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

lock()也不是必需的(如果你有更多麻烦)。

所以删除所有这些,因为你有可能错了一些。

如果它仍然不起作用,请编辑问题并提供更多信息。 现在有很多人遗失:

  • 您是否可以使用调试器validation下载循环是否完全执行。
  • 如何转换到第二个范围52k – 104k
  • 结果文件到底有多长?
  • 该文件包含前52k字节或第二次下载?
  • 等等

所有这些都很重要,我们不应该猜测。

我会尝试以某种方式下载图像,你知道它的工作原理并比较字节结果,以检查文件被破坏的位置以及打破它的原因……

这段代码是邪恶的……对不起,你必须从删除所有代码并从头开始查看你的问题开始。 有很多更好的方法可以实现你想要的。 看看一些好的解决方案:
http://www.codeproject.com/KB/IP/MyDownloader.aspx