在c#中进行可恢复下载时出错

时间:2012-01-08 16:29:23

标签: c# httprequest httpresponse

我试图使用c#测试可恢复的下载。我发现添加范围有助于查看一些博客。但是在以下代码中添加范围没有意义。 伙计们建议我如何解决这个问题。 什么方法可以有效地进行Resumable下载?

HttpWebRequest myrequest = null;
    HttpWebResponse myresponse = null;
    private int interval=2048;
    public bool set_url(string todonwloads,string tosaves)
    {
        this.todownload = todonwloads;
        this.tosave = tosaves;
        return true;
    }
    public bool start_download()
    {
        myrequest = (HttpWebRequest)WebRequest.Create(this.todownload);
       // it the following code. 
       //If i dont write addrange. It will download same portion of the file.
        myrequest.AddRange(4000,8000);

        try
        {
            myresponse = (HttpWebResponse)myrequest.GetResponse();
            if (myresponse.StatusCode == HttpStatusCode.OK)
            {
                Stream ReceiveSteam = myresponse.GetResponseStream();
                FileStream fs = new FileStream(
                                        this.tosave, 
                                        FileMode.Create, 
                                        FileAccess.Write, 
                                        FileShare.None);
                int reads;
                byte[] buffer = new byte[this.interval];
                while ((reads = ReceiveSteam.Read(
                                         buffer, 
                                         0, 
                                         this.interval)) > 0)
                {
                    fs.Write(buffer, 0, reads);
                }
                return true;
            }


        }
        catch (WebException ex)
        {

            throw ex;
        }
        finally
        {
            if (myresponse != null)
            {
                myresponse.Close();
            }
        }
        return false;

    }

1 个答案:

答案 0 :(得分:0)

每次下载文件的一部分时,您都会创建并覆盖该文件:

//            Overwrites the file each time -\/
... = new FileStream(this.tosave, FileMode.Create, ...

您需要使用FileMode.OpenOrCreate 打开或创建文件,然后搜索您写入的文件的最后一部分:

// seek to the last end offset, you'll need to save this somehow
fs.Seek(lastOffset, SeekOrigin.Begin);

int reads;
byte[] buffer = new byte[this.interval];
while ((reads = ReceiveSteam.Read(buffer, 0, this.interval)) > 0)
{
    fs.Write(buffer, 0, reads);
    lastOffset += reads;
}