代码之家  ›  专栏  ›  技术社区  ›  Vasyl Boroviak

正在下载文件。网络问题导致文件损坏

  •  0
  • Vasyl Boroviak  · 技术社区  · 14 年前

    HttpWebRequest -> WebResponse -> Stream -> FileStream . 参见下面的代码。

    1. 开始下载。
    2. 拔下电缆或单击以暂停下载过程。
    3. 关闭并打开应用程序。
    4. 开始下载(从中断点开始)。

    问题:下载的文件已损坏。

    public class Downloader
    {
        int StartPosition { get; set; }
        int EndPosition { get; set; }
        bool Cancelling { get; set; }
    
        void Download(string[] args)
        {
            string uri = @"http://www.example.com/hugefile.zip";
            string localFile = @"c:\hugefile.zip";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.AddRange(this.StartPosition);
            WebResponse response = request.GetResponse();
            Stream inputStream = response.GetResponseStream();
    
            using (FileStream fileStream = new FileStream(localFile, FileMode.Open, FileAccess.Write))
            {
                int buffSize = 8192;
                byte[] buffer = new byte[buffSize];
                int readSize;
    
                do
                {
                    // reads the buffer from input stream
                    readSize = inputStream.Read(buffer, 0, buffSize);
    
                    fileStream.Position = this.StartPosition;
                    fileStream.Write(buffer, 0, (int)readSize);
                    fileStream.Flush();
    
                    // increase the start position
                    this.StartPosition += readSize;
    
                    // check if the stream has reached its end
                    if (this.EndPosition > 0 && this.StartPosition >= this.EndPosition)
                    {
                        this.StartPosition = this.EndPosition;
                        break;
                    }
    
                    // check if the user have requested to pause the download
                    if (this.Cancelling)
                    {
                        break;
                    }
                }
                while (readSize > 0);
            }
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Martin Smith    14 年前

    要解决这个问题,我建议做一个文件比较,以确定差异是什么。下载的是不是少了一节?它有重复的部分还是有不正确的部分?

        2
  •  1
  •   Hans Passant    14 年前

    AddRange()调用错误,您希望传递一个负值,以便获得文件的其余部分。来自MSDN库文章:


    如果范围为负数,则范围为从范围到数据末尾。