4

我正在编写的一个工具负责在几个小时内下载数千个图像文件。最初,使用TIdHTTP,我会将Get文件放入 a TMemoryStream,然后将其保存到文件中,只要没有例外。为了提高速度,我TMemoryStreamTFileStream.

但是,现在如果找不到资源,或者任何导致没有实际文件的异常,它仍然会保存一个空文件。

完全可以理解,因为我只是在下载之前创建了一个文件流......

FileStream:= TFileStream.Create(FileName, fmCreate);
try
  Web.Get(AURL, FileStream);
finally
  FileStream.Free;
end;

我知道如果出现异常,我可以简单地删除该文件。但这似乎太草率了。我确信有一种更合适的方法可以终止这种情况。

如果出现异常,我应该如何使它不保存文件,同时不改变性能(如果可能的话)?

4

2 回答 2

11

如果出现异常,我应该如何使它不保存文件,同时不改变性能(如果可能的话)?

这一般是不可能的。任何步骤都可能发生错误和故障,包括下载的部分过程。一旦理解了这一点,那么您必须接受文件可以部分下载然后放弃。你在哪里存储它?

显而易见的选择是内存和文件。您不想存储到内存中,这会留给文件。

这将带您回到当前的解决方案。

我知道如果出现异常,我可以简单地删除该文件。

这是正确的做法。对此有一些变体。例如,您可以下载到使用标志创建的临时文件,以便在关闭时安排删除。只有下载完成后,您才会复制到真正的目的地。这是浏览器采用的方法。但基本思想是下载到文件,并通过整理来处理任何故障。

于 2017-10-21T07:29:15.657 回答
0

如果服务器支持,您可以考虑使用 HTTP 范围请求,而不是一次性下载整个图像。然后,您可以将文件分成更小的部分,在第一次完成后请求下一部分(甚至同时请求多个部分以提高性能)。如果有异常,那么您可以了解未来的请求,因此它们永远不会从一开始就开始。

YouTube 和一些流媒体网站不久前就开始这样做了。过去,如果您开始播放视频,然后暂停它,那么它最终会缓存整个视频。现在它只缓存在当前位置之前一点点。由于视频的放弃率,这可以节省大量带宽。

您可以将部分文件写入磁盘或将其保存在内存中。

于 2017-10-22T21:42:38.647 回答