这里我只能浅谈一下自己的理解
- 拿到一个下载任务后,先请求一次文件信息,需要得到文件长度Content-Length,请求ETag、最终更新时间或服务端自行生成文件md5等信息作为该下载任务文件的唯一标识(这样可以防止如果两次下载间隙,源文件更换导致的问题),并在定好的路径下创建以唯一标识为名称的文件夹以存放文件分片。
- 一个子任务类,存放子任务ID,需要请求的range,字节大小等数据。该类的对象负责请求一个任务分片,并对请求好的数据按标识序号进行存储
FString SubTaskFileName = MD5Str + TEXT("_") + FString::FromInt(TaskID) + TEXT(".hcf");
FFileHelper::SaveArrayToFile(RawData, *(CurFilePath / SubTaskFileName));
- 根据实际需要确认每个分片的大小,将请求得来的文件长度除以分片大小分为数个子任务,将这些子任务逐个创建,分配请求数据范围,并执行下载请求,下载结束后标记状态为已下载。
- 如果下载中断,重新下载,则执行同样的流程,会尝试读取本地该标识的文件夹,读取已下载的部分,同样进行已下载标记,然后继续下载。
- 每次下载完分片后对维护的所有子任务数组进行判断,如果全部为已下载状态,则将所有下载完成的分片进行按ID拼接,存储至目标文件。
- 清理临时文件。