C# 分段文件写入的一个问题

C# 分段文件写入的一个问题,c#,C#,我下载了一个文件的部分(图片),然后我想把这些部分保存到一个文件中 问题是,第一部分被正确下载和保存(我可以看到该部分)。但是,当保存第二部分(FileMode.Append)时,图片似乎被破坏了 代码如下: HttpWebRequest webRequest; HttpWebResponse webResponse; Stream responseStream; long StartPosition, EndPosition; if (File.Exists(

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

问题是,第一部分被正确下载和保存(我可以看到该部分)。但是,当保存第二部分(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
fileStream.Seek()
Buffer=new byte[byteslight]

另外,
lock()
也不应该是必需的(如果是的话,您会遇到很多麻烦)

所以把所有这些都去掉,因为你很可能弄错了

如果仍然不起作用,编辑问题并提供更多信息。现在缺少的东西很多:

  • 您能否使用调试器验证下载循环是否已执行
  • 如何转换到第二范围52k-104k
  • 最终生成的文件有多长
  • 文件包含前52k字节还是第二次下载

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

我会尝试以某种方式下载图像,让您知道它是有效的,然后比较字节结果,以检查文件在哪里被破坏,以及是什么破坏了它…

这段代码很糟糕。。。很抱歉,您必须从删除所有代码开始,并从头开始查看您的问题。有很多更好的方法来实现你想要的。看看一些好的解决方案:

什么是“似乎破碎了”?不要使用FileMode.Append。当我在写第二部分后尝试打开该图片时,我看不到它的内容。你的代码太错误了,我甚至不知道从哪里开始。为什么你需要下载文件的一部分呢?“因为我想开发文件下载管理器。这段代码很糟糕。。。很抱歉,您必须从删除所有代码开始,并从头开始查看您的问题。有很多更好的方法来实现你想要的。请看一些好的解决方案:我需要Seek操作和锁,因为本地文件将被许多线程访问。我看到了-奇怪的是-文件的第二部分与第一部分的前4096字节相同。我知道服务器支持范围标头,因为第一部分已正确下载。如果在不同的线程中使用FileStream(不是:文件),则不能使用附加模式。好的,我可以将其更改为FileMode。打开
    StartPosition = 52062;
    EndPosition = 104122;