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

时间:2010-06-18 12:33:59

标签: c# .net download httpwebrequest

我的应用程序使用HttpWebRequest -> WebResponse -> Stream -> FileStream下载大文件。请参阅下面的代码。

遵循该方案我们总是会损坏文件:

  1. 开始下载。
  2. 拔下电缆或点击暂停下载过程。
  3. 关闭并打开该应用程序。
  4. 开始下载(从中断点开始)。
  5. 等待下载完整文件。
  6. 问题:下载的文件已损坏。

    我确定这是常见的问题,但我没有谷歌搜索或找到它。请指教。可能是什么原因?

    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 个答案:

答案 0 :(得分:1)

AddRange()调用错误,您想传递一个负值,这样您就可以得到文件的其余部分。来自MSDN Library文章:

如果范围为正,则范围是从数据的开头到范围。
如果范围为负,则范围是从范围到数据的结尾。

我无法看到EndPosition如何被初始化,这也可能是错误的。

答案 1 :(得分:1)

要解决此问题,我建议您进行文件比较以确定差异。下载的是丢失的部分吗?它是否有重复的部分或是否有不正确的部分?