Torrent的工作原理是从多个源并行下载文件的各个部分,然后将这些部分组合成最终文件。 如果所有服务器(甚至只有一个服务器)都支持HTTP Range请求头,那么您也可以使用TIdHTTP来下载文件,例如,您可以下载字节范围为0-1023、1024-2047、2048-3071的文件,以此类推,直到最后一个块。 如果您的服务器支持此功能,则可以执行以下操作: 1.在磁盘上创建一个文件,并将其大小预设为最终文件的总大小(请参见How do you pre-allocate space for a file in C/C++ on Windows?)。
1条答案
按热度按时间z9smfwbn1#
Torrent的工作原理是从多个源并行下载文件的各个部分,然后将这些部分组合成最终文件。
如果所有服务器(甚至只有一个服务器)都支持HTTP
Range
请求头,那么您也可以使用TIdHTTP
来下载文件,例如,您可以下载字节范围为0-1023
、1024-2047
、2048-3071
的文件,以此类推,直到最后一个块。如果您的服务器支持此功能,则可以执行以下操作:
1.在磁盘上创建一个文件,并将其大小预设为最终文件的总大小(请参见How do you pre-allocate space for a file in C/C++ on Windows?)。
TIdHTTP
。TFileStream
1到最终文件,请求并共享读/写访问/权限,然后在文件中查找该片段所需的起始偏移量。TFileStream
,将TIdHTTP.Request.Range
属性设置为'bytes=<start>-<end>'
,其中start
是文件中片段的起始偏移量,end
是结束偏移量。1更新:哦,等等,我忘了
TIdHTTP
(更具体地说,TIdIOHandler.ReadStream()
)将给定的TStream
的大小调整为正在下载的数据的大小(如果服务器报告了该大小)(在这种情况下会发生)。当你已经预先调整了目标文件的大小时,你不希望发生这种情况,否则,如果您将多个TFileStream
下载到同一个文件中,它将被截断/损坏。因此,您不能在此处使用标准的TFileStream
。不过,您可以做的是,就是从TFileStream
派生一个新类,然后重写它的虚拟SetSize()
方法,什么都不做。我想这应该可以。或者:
TIdHTTP
。TFileStream
(标准的TFileStream
在这里是好的)到一个单独的临时文件,请求只写访问和共享没有权利,不要寻找它。TFileStream
,如上所述设置TIdHTTP.Request.Range
。