我正在尝试使用curl从多个线程同时使用多部分同步从Internet下载数据。但是,我在下载完成时遇到问题,我必须将所有部分合并在一起,这会浪费内存并花费太长时间。
我看到Torrent和Flashget使用这个名字我不知道的技术。在下载之前,Torrent获取文件的内容长度并自动在磁盘中分配一个空文件。之后,如果恢复下载,下载的数据将填充此分配的文件。 Torrent或Flashget将检查此分配文件以获取已下载的字节并恢复下载。
任何人都可以帮助我使用这种技术,或者给我一些关于此文档的链接?如果您可以使用c#或c ++建议我的示例,那将会很棒。谢谢你的帮助
答案 0 :(得分:0)
要在磁盘上预分配文件,您可以执行以下操作:
1。打开文件进行写作。
HANDLE file = CreateFile("some_file.bin", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2. 将文件指针移动到所需位置。
LONG download_size = /* check, how much data is going to be downloaded */;
SetFilePointer(file, download_size, NULL, FILE_BEGIN);
3. 以物理方式扩展文件。
SetEndOfFile(file);
更多信息:
至于这一部分:
检查此分配文件以获取字节已下载并恢复下载。
您可以通过使用标题以自定义格式存储部分下载来实现此目的。例如,定义一个struct:
struct TmpDownloadInfo
{
uint32_t header_size;
size_t downloaded_bytes;
//other fields?
};
然后,将临时数据存储在文件中,以此标头开头并在每次修改时更新它(当然,请记住,在这种情况下,您需要预先分配download_size + sizeof(TmpDownloadInfo)
)。下载完成后,您可以删除此标题并更新文件大小或将整个数据复制到新的结果文件(可能即时“合并”)。