我正在编写的工具负责在几个小时内下载数千个图像文件。最初,使用TIdHTTP
,我将Get
文件放入TMemoryStream
,然后将其保存到文件中,只要没有例外。为了提高速度,我将TMemoryStream
更改为TFileStream
。
但是,现在如果找不到资源,或者导致没有实际文件的任何异常,它仍会保存一个空文件。
完全可以理解,因为我只是在下载之前创建一个文件流...
FileStream:= TFileStream.Create(FileName, fmCreate);
try
Web.Get(AURL, FileStream);
finally
FileStream.Free;
end;
我知道如果有异常,我可以删除该文件。但它似乎太草率了。我确信有一种更合适的方法可以中止这种情况。
如果有异常,我应该怎么做才能保存文件,而不改变性能(如果可能的话)?
答案 0 :(得分:11)
如果有异常,我应该怎么做才能保存文件,而不改变性能(如果可能的话)?
一般来说,这是不可能的。错误和失败可能发生在任何步骤,如果方式,包括通过下载的部分方式。理解了这一点后,您必须接受该文件可以部分下载然后放弃。那你在哪里储存它?
显而易见的选择是内存和文件。你不想存储到存储器,它留给文件。
这将带您回到当前的解决方案。
我知道如果有异常我只能删除该文件。
这是正确的方法。这有几个变种。例如,您可能会下载到使用标志创建的临时文件,以便在关闭时排列其删除。只有下载完成后才能复制到真正的目的地。这是浏览器采用的方法。但基本的想法是下载到文件并通过整理来处理任何失败。
答案 1 :(得分:0)
如果服务器支持HTTP范围请求,您可以考虑使用HTTP范围请求,而不是一次性下载整个映像。然后,您可以将文件分块为较小的部分,在第一次完成后请求下一部分(或者甚至同时请求多个部分以提高性能)。如果存在异常,那么您可以了解未来的请求,因此它们永远不会从头开始。
YouTube和许多流媒体网站刚刚开始这样做。过去,如果你开始播放视频,然后暂停它,那么它最终会缓存整个视频。现在它只缓存当前位置的一点点。由于视频放弃率,这可以节省大量带宽。
您可以将部分文件写入磁盘或将其保留在内存中。