0

所以我正在开发自己的下载管理器用于教育目的。我有多个连接/线程下载文件,每个连接都适用于文件的特定范围。现在,在他们都获取了他们的块之后,我不知道如何将这些块放在一起重新制作原始文件。

我做了什么:

首先,我在“wb”模式下创建了一个临时文件,并允许每个连接/线程转储它们的块。但是每次连接执行此操作时,它都会覆盖以前保存的块。我认为这是因为我使用了“wb”文件描述符。我将其更改为“ab”,但我无法再执行 seek() 操作

我在找什么:

我需要一种优雅的方式将这个块重新打包到原始文件中。我想知道其他下载管理器是如何做到的。

预先感谢。

4

2 回答 2

2

您需要将块写入不同的临时文件,然后按原始顺序加入它们。如果您为所有线程打开一个文件,您应该按顺序访问它以保持正确的数据顺序,这会丢弃线程使用,因为线程应该等待前一个。顺便说一句,您应该以wb模式打开文件。

于 2010-12-07T16:52:44.880 回答
1

你做得很好:seek()write(). 那应该工作!

现在,如果您想要一个更简洁的结构,没有那么多线程在文件中移动,您可能需要考虑拥有下载线程和磁盘写入线程。最后一个可能只是休眠直到被其他一个唤醒,将一些 kb 写入磁盘,然后重新进入休眠状态。

于 2010-12-07T16:48:56.800 回答