2013-08-24 84 views
1

我正在C#中創建下載管理器。我目前正在設計給定URL的下載組件,從網段中下載文件。我目前使用我

/O流的每個組塊,如下所示:在C#中使用下載管理器下載文件

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

使用發佈的代碼,您只下載了文件的一部分,這是正確的。根據緩衝區的大小,整個下載不太可能適合緩衝區。所以你必須重複從上面的代碼片段,直到到達流的末尾。這就是從緩衝流中讀取數據的原理。

但是通過下載文件塊,有一個共同的觀點,即文件被拆分成多個部分,然後這些部分被單獨下載。

要實現這個功能,您必須使用HTTP Range標頭(請參閱this question進行討論),它允許您只下載一大塊數據並使用多個客戶端。

下載不會加快,即使你使用多個線程在同一時間,因爲你bandwidth是限制下載速度,下載塊。相反,您必須管理塊偏移和冗餘連接。

提到的方法DownloadDataAsync用於非阻塞方式下載數據,您可以查看this question進行討論。

現在問題的第二部分:雖然它在某些情況下可能在播放過程中以塊的形式下載文件,但這種方法在連接速度較慢時會失敗。你有沒有考慮過尋找streaming solution

最後,this question指向NAudio,它甚至帶有Mp3StreamingDemo,允許播放流式傳輸的mp3音頻文件。