分段文件写入的问题

时间:2010-09-12 13:34:50

标签: c#

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

  • 您是否可以使用调试器验证是否完全执行了下载循环。
  • 如何转换到第二个范围52k - 104k
  • 最终生成的文件有多长?
  • 该文件是否包含前52k字节或第二次下载?

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

此代码很糟糕...抱歉,您必须从删除所有代码并从头开始查看问题开始。有很多更好的方法可以实现你想要的。看看一些好的解决方案:
http://www.codeproject.com/KB/IP/MyDownloader.aspx