C#中的多部分下载?

5
请原谅我在这个主题上的无知。
我想用C#编写一个应用程序,可以像 DownThemAll一样从服务器下载文件。DownThemAll似乎会打开四个连接到HTTP服务器以下载同一个文件。我只是想知道是否有任何现有的库可以做到这一点。
这是他们网站上关于此功能的一句话引用:
“DownThemAll具有称为“多部分下载”的智能下载技术。它将文件分成多个部分,同时下载。”
我还希望能够暂停/恢复下载。这是我想要的基本功能,我不一定需要完整的下载管理器库,但如果有一个可以做到这些事情的库,那我也很想知道。这些文件位于使用lighttpd托管的密码保护目录中,因此我还需要某种验证方式。
如果没有我可以使用的预先存在的库,那么我应该查看哪些.NET类,可能能够做到这一点?
谢谢!
编辑:重新措辞标题以更加合适,并添加了DownThemAll网站上的一句话说明它是什么。 第二次编辑:我认为svens发布的回答目前是最合适的,尽管只是一条评论 :/ 这是我的错,因为我用词不当,不知道自己在说什么。他发布了一个文章,介绍了HTTP下载暂停/恢复。它还讨论了Range头部,这就是我认为我应该使用的内容:

Range头部能够在单个请求中请求多个范围,这个功能称为“多部分范围”。不要将这与分段下载混淆,几乎所有下载工具都使用分段下载来提高下载速度。这些工具声称通过打开两个或更多同时连接来提高下载速度,每个连接请求文件的不同范围。

所以我认为我想要使用范围同时下载文件的某些部分。然而,这可能没有任何优势,只需一次性下载文件即可。我会这样做并允许暂停/恢复。

谢谢大家!

P.S svens,请把评论发表为答案,如果你愿意的话,我可以接受它。


2
http://www.devx.com/dotnet/Article/22533/0/page/2 描述了HTTP协议中如何恢复下载,http://www.codeproject.com/KB/IP/pauseresume.aspx则描述了如何在FTP服务器上实现此功能。 - svens
那可能是一个答案。他们可能使用同样的方法来下载文件的不同部分,然后在这些部分完成后将它们组合起来。 - Jorge Israel Peña
1
这种做法实际上对服务器不利,因此会采取措施阻止此类下载尝试。这个技巧起源于拨号调制解调器时代,当时人们试图将其挤满。只需友好地使用一个连接进行下载即可。编辑:出于多种原因,这种方法在我的服务器上将失败。我喜欢为“吸血鬼”设置障碍。 - Zdenek
6个回答

3

1

System.Net.HttpClient 类应该能够下载您的文件。只需从线程或线程池调用此类,即可同时下载大量文件。


1
谢谢,我很感激。但是我并不是想要同时下载多个文件。DownThemAll 以某种方式打开了四个连接到 HTTP 服务器,以下载/同一个/文件。 - Jorge Israel Peña
HttpClient可能比Http.Get更容易... +1 - overstood
1
他们称之为“多部分下载”。 - Jorge Israel Peña

1

谢谢。既然他先说了,我会等一段时间看看他是否将其发布为答案,以便我可以接受它。否则,出于解决此问题的考虑,它将归属于你。 - Jorge Israel Peña

0

0

0

如果你想使用一个包,而不想自己编写类似的代码,你可以在Nuget上使用Shard Download Library。它可以下载多部分文件。要使用它,你需要编写类似下面的代码:


async Task DownloadFileAsync(string fileURL)
{
   //"https://speed.hetzner.de/100MB.bin"

    LoadRequestOptions option = new()
    {
        Progress = new Progress<float>(value => Console.WriteLine(value.ToString("0.0%"))),
        RequestCompleated = path => Console.WriteLine("Finished: " + path?.ToString()),
        Chunks = 8 //«Split the file into chunks/parts
    };
    
    await new LoadRequest(link, option).Task;
} 

我希望它有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接