所以我正在开发自己的下载管理器用于教育目的。我有多个连接/线程下载文件,每个连接都在文件的特定范围内工作。现在,他们已经取了他们的块,我不知道如何把这些块一起重新制作原始文件。
我做了什么:
首先,我在'wb'模式下创建了一个临时文件,并允许每个连接/线程转储它们的块。但每次连接执行此操作时,它都会覆盖以前保存的块。我想这是因为我使用了'wb'文件描述符。我将其更改为'ab',但我无法执行seek()操作
我在寻找:
我需要一种优雅的方法将这个块重新打包到原始文件中。我想知道其他下载经理是如何做到的。
提前感谢。
答案 0 :(得分:2)
您需要将不同的临时文件写入块,然后按原始顺序加入它们。如果为所有线程打开一个文件,则应该按顺序访问它以保持正确的数据顺序,这会丢弃线程使用,因为线程应该等待前一个线程。顺便说一下,你应该以{{1}}模式打开文件。
答案 1 :(得分:1)
你做得很好:seek()
和write()
。这应该有效!
现在,如果你想要一个更干净的结构,没有那么多线程在整个文件中移动他们的手,你可能想要考虑有下载程序线程和磁盘写入线程。最后一个可能只是睡觉,直到被其他人吵醒,写一些kb到磁盘,然后再回去睡觉。