使用C#中的下载管理器下载文件

时间:2013-08-24 10:32:13

标签: c# .net download download-manager

我正在使用C#创建下载管理器。我目前正在设计给定URL的下载组件,从URL中分段下载文件。

我目前正在为每个块使用I / O流,如图所示下面:

    MyChunks.InputStream = rs ; 
//rs is obtained by using GetResponse() from FtpWebRequest or HttpWebRequest
    MyChunks.OutputStream = fs ; //fs is FileStream for writing on local file
    chunksize = MyChunks.InputStream.Read(buffer, 0, bufferSize);
    MyChunks.OutputStream.Write(buffer, 0, (int)chunksize);

关于我分析的其他方法,我发现我也可以使用`WebClient.DownloadDataAsync`方法。
但是,我无法利用在多个线程上下载的数据块来加速下载。此外,上面的代码工作正常。


我的问题是:

  1. 是否有其他方法可供下载或更高版块 代码很好吗?

  2. 另外,我想在下载时播放音频(mp3)/视频文件 你能建议做同样的方法吗?

1 个答案:

答案 0 :(得分:1)

使用发布的代码,您只下载文件的一部分,这是正确的。根据缓冲区的大小,整个下载不太可能适合缓冲区。因此,您必须重复上面的代码片段,直到到达流的末尾。这就是从缓冲流中读取数据的方式。

通过以块的形式下载文件,有一个共同的概念,即文件分为多个部分,然后单独下载这些部分。

要实现您必须使用HTTP Range标头(请参阅this question进行讨论),这样您只能下载一大块数据并使用多个客户端。

即使您使用多个线程同时下载块,下载也不会加速,因为您的bandwidth 正在限制下载速度。相反,您必须管理块偏移和冗余连接。

上述方法DownloadDataAsync用于以非阻塞方式下载数据,您可以查看this question进行讨论。

现在问题的第二部分:虽然在某些情况下它可能适用于在播放期间以块的形式下载文件,但这种方法在较慢的连接上会失败。您考虑过寻找streaming solution吗?

最后,this question指向NAudio,其中包含Mp3StreamingDemo,可以播放流式mp3音频文件。